diff --git a/README.md b/README.md index 99c9ba603bcdfa434e34bbedf4782f1a7e03cf3e..961ff4726ad9d9e3352855f7ab464e8097ebc190 100644 --- a/README.md +++ b/README.md @@ -127,7 +127,23 @@ | 105 | [react-native-worklets-core](https://github.com/react-native-oh-library/react-native-worklets-core) | 0.5.0 | 是 | [react-native-worklets-core](https://github.com/react-native-oh-library/react-native-worklets-core/releases) | [链接](/zh-cn/react-native-worklets-core.md) | | 106 | [react-use](https://github.com/zenghongtu/react-use) | 17.2.4 | - | [react-use](https://github.com/zenghongtu/react-use/releases) | [链接](/zh-cn/react-use.md) | | 107 | [redux-toolkit](https://github.com/reduxjs/redux-toolkit) | 2.2.3 | - | [redux-toolkit](https://github.com/reduxjs/redux-toolkit/releases) | [链接](/zh-cn/redux-toolkit.md) | +| 108 | [react-native-text-size](https://github.com/aMarCruz/react-native-text-size) | 4.0.0 | 是 | [react-native-text-size](https://github.com/react-native-oh-library/react-native-text-size/releases) | [链接](/zh-cn/react-native-text-size.md) | +| 109 | [react-router-dom](https://github.com/remix-run/react-router) | 6.22.3 | 是 | [react-router-dom](https://github.com/remix-run/react-router/releases) | [链接](/zh-cn/react-router-dom.md) | +| 110 | [redux-actions](https://github.com/redux-utilities/redux-actions) | 3.0.0 | - | [redux-actions](https://github.com/redux-utilities/redux-actions/releases) | [链接](/zh-cn/redux-actions.md) | +| 111 | [redux-thunk](https://github.com/reduxjs/redux-thunk) | 3.1.0 | - | [redux-thunk](https://github.com/reduxjs/redux-thunk/releases) | [链接](/zh-cn/redux-thunk.md) | +| 112 | [react-native-aria](https://github.com/gluestack/react-native-aria/) | 0.2.4 | 是 | [react-native-aria](https://github.com/gluestack/react-native-aria/releases) | [链接](/zh-cn/react-native-aria.md) | +| 113 | [react-native-progress](https://github.com/oblador/react-native-progress) | 5.0.1 | - | [react-native-progress](https://github.com/react-native-oh-library/react-native-progress/releases) | [链接](/zh-cn/react-native-progress.md) | +| 114 | [react-native-fs](https://github.com/itinance/react-native-fs) | 2.20.0 | 是 | [react-native-fs](https://github.com/react-native-oh-library/react-native-fs/releases) | [链接](/zh-cn/react-native-fs.md) | +| 115 | [react-native-keyboard-aware-scroll-view](https://github.com/APSL/react-native-keyboard-aware-scroll-view) | 0.9.5 | - | [react-native-keyboard-aware-scroll-view](https://github.com/react-native-oh-library/react-native-keyboard-aware-scroll-view/releases) | [链接](/zh-cn/react-native-keyboard-aware-scroll-view.md) | +| 116 | [react-native-permissions](https://github.com/zoontek/react-native-permissions) | 4.1.5 | 是 | [react-native-permissions](https://github.com/react-native-oh-library/react-native-permissions/releases) | [链接](/zh-cn/react-native-permissions.md) | +| 117 | [react-native-drag-sort](https://github.com/mochixuan/react-native-drag-sort) | 2.4.4 | 是 | [react-native-drag-sort](https://github.com/mochixuan/react-native-drag-sort/releases) | [链接](/zh-cn/react-native-drag-sort.md) | +| 118 | [react-native-sound](https://github.com/zmxv/react-native-sound) | 0.11.2 | 是 | [react-native-sound](https://github.com/react-native-oh-library/react-native-sound/releases) | [链接](/zh-cn/react-native-sound.md) | +| 119 | [react-native-reanimated-carousel](https://github.com/dohooo/react-native-reanimated-carousel) | 3.5.1 | - | [react-native-reanimated-carousel](https://github.com/dohooo/react-native-reanimated-carousel/releases) | [链接](/zh-cn/react-native-reanimated-carousel.md) | +| 120 | [@react-native-community/toolbar-android](https://github.com/react-native-toolbar-android/toolbar-android) | 0.2.1 | 是 | [@react-native-community/toolbar-android](https://github.com/react-native-oh-library/toolbar-android/releases) | [链接](/zh-cn/react-native-toolbar-android.md) | +| 121 | [react-redux](https://github.com/reduxjs/react-redux) | 9.1.1 | - | [react-redux](https://github.com/reduxjs/react-redux/releases) | [链接](/zh-cn/react-redux.md) | +| 122 | [react-native-MJRefresh](https://github.com/react-native-studio/react-native-MJRefresh) | 0.7.0 | - | [react-native-MJRefresh](https://github.com/react-native-oh-library/react-native-MJRefresh/releases) | [链接](/zh-cn/react-native-MJRefresh.md) | + ## 社区 -[Github Organization: react-native-oh-library](https://github.com/react-native-oh-library) \ No newline at end of file +[Github Organization: react-native-oh-library](https://github.com/react-native-oh-library) diff --git a/_sidebar.md b/_sidebar.md index c1d57b7a721de82e5114bc409526293f36153b47..67b658e1cd1e8a9318251c13aaefe8f6e59d2091 100644 --- a/_sidebar.md +++ b/_sidebar.md @@ -39,6 +39,13 @@ - [react-native-pdf](/zh-cn/react-native-pdf.md) - [react-native-image-editor](/zh-cn/react-native-image-editor.md) - [react-native-worklets-core](/zh-cn/react-native-worklets-core.md) + - [react-native-text-size](/zh-cn/react-native-text-size.md) + - [react-native-fs](/zh-cn/react-native-fs.md) + - [react-native-permissions](/zh-cn/react-native-permissions.md) + - [react-native-sound](/zh-cn/react-native-sound.md) + - [react-native-blob-util](/zh-cn/react-native-blob-util.md) + - [@react-native-community/toolbar-android](/zh-cn/react-native-toolbar-android.md) + - [react-native-MJRefresh](/zh-cn/react-native-MJRefresh.md) - RN JS库 - [lottie-react-native](/zh-cn/lottie-react-native.md) - [react-i18next](/zh-cn/react-i18next.md) @@ -96,6 +103,12 @@ - [react-use](/zh-cn/react-use.md) - [redux-toolkit](/zh-cn/redux-toolkit.md) - [react-native-image-viewing](/zh-cn/react-native-image-viewing.md) + - [react-native-aria](/zh-cn/react-native-aria.md) + - [react-native-progress](/zh-cn/react-native-progress.md) + - [react-native-keyboard-aware-scroll-view](/zh-cn/react-native-keyboard-aware-scroll-view.md) + - [react-native-reanimated-carousel](/zh-cn/react-native-reanimated-carousel.md) + - [react-native-drag-sort](/zh-cn/react-native-drag-sort.md) + - [react-redux](/zh-cn/react-redux.md) - 纯JS库 - [crypto-js](/zh-cn/crypto-js.md) - [deepmerge](/zh-cn/deepmerge.md) @@ -113,3 +126,6 @@ - [redux-persist](/zh-cn/redux-persist.md) - [qrcode-generator](/zh-cn/qrcode-generator.md) - [EventBus](/zh-cn/EventBus.md) + - [react-router-dom](/zh-cn/react-router-dom.md) + - [redux-actions](/zh-cn/redux-actions.md) + - [redux-thunk](/zh-cn/redux-thunk.md) diff --git a/zh-cn/README.md b/zh-cn/README.md index f99033f9fb60e025777fd57e833657ed52074f91..fe4d6b3356ca8bc5054550db5c256f7052164321 100644 --- a/zh-cn/README.md +++ b/zh-cn/README.md @@ -127,7 +127,24 @@ | 105 | [react-native-worklets-core](https://github.com/react-native-oh-library/react-native-worklets-core) | 0.5.0 | 是 | [react-native-worklets-core](https://github.com/react-native-oh-library/react-native-worklets-core/releases) | [链接](/zh-cn/react-native-worklets-core.md) | | 106 | [react-use](https://github.com/zenghongtu/react-use) | 17.2.4 | - | [react-use](https://github.com/zenghongtu/react-use/releases) | [链接](/zh-cn/react-use.md) | | 107 | [redux-toolkit](https://github.com/reduxjs/redux-toolkit) | 2.2.3 | - | [redux-toolkit](https://github.com/reduxjs/redux-toolkit/releases) | [链接](/zh-cn/redux-toolkit.md) | +| 108 | [react-native-text-size](https://github.com/aMarCruz/react-native-text-size) | 4.0.0 | 是 | [react-native-text-size](https://github.com/react-native-oh-library/react-native-text-size/releases) | [链接](/zh-cn/react-native-text-size.md) | +| 109 | [react-router-dom](https://github.com/remix-run/react-router) | 6.22.3 | 是 | [react-router-dom](https://github.com/remix-run/react-router/releases) | [链接](/zh-cn/react-router-dom.md) | +| 110 | [redux-actions](https://github.com/redux-utilities/redux-actions) | 3.0.0 | - | [redux-actions](https://github.com/redux-utilities/redux-actions/releases) | [链接](/zh-cn/redux-actions.md) | +| 111 | [redux-thunk](https://github.com/reduxjs/redux-thunk) | 3.1.0 | - | [redux-thunk](https://github.com/reduxjs/redux-thunk/releases) | [链接](/zh-cn/redux-thunk.md) | +| 112 | [react-native-aria](https://github.com/gluestack/react-native-aria/) | 0.2.4 | 是 | [react-native-aria](https://github.com/gluestack/react-native-aria/releases) | [链接](/zh-cn/react-native-aria.md) | +| 113 | [react-native-progress](https://github.com/oblador/react-native-progress) | 5.0.1 | - | [react-native-progress](https://github.com/react-native-oh-library/react-native-progress/releases) | [链接](/zh-cn/react-native-progress.md) | +| 114 | [react-native-fs](https://github.com/itinance/react-native-fs) | 2.20.0 | 是 | [react-native-fs](https://github.com/react-native-oh-library/react-native-fs/releases) | [链接](/zh-cn/react-native-fs.md) | +| 115 | [react-native-keyboard-aware-scroll-view](https://github.com/APSL/react-native-keyboard-aware-scroll-view) | 0.9.5 | - | [react-native-keyboard-aware-scroll-view](https://github.com/react-native-oh-library/react-native-keyboard-aware-scroll-view/releases) | [链接](/zh-cn/react-native-keyboard-aware-scroll-view.md) | +| 116 | [react-native-permissions](https://github.com/zoontek/react-native-permissions) | 4.1.5 | 是 | [react-native-permissions](https://github.com/react-native-oh-library/react-native-permissions/releases) | [链接](/zh-cn/react-native-permissions.md) | +| 117 | [react-native-drag-sort](https://github.com/mochixuan/react-native-drag-sort) | 2.4.4 | 是 | [react-native-drag-sort](https://github.com/mochixuan/react-native-drag-sort/releases) | [链接](/zh-cn/react-native-drag-sort.md) | +| 118 | [react-native-sound](https://github.com/zmxv/react-native-sound) | 0.11.2 | 是 | [react-native-sound](https://github.com/react-native-oh-library/react-native-sound/releases) | [链接](/zh-cn/react-native-sound.md) | +| 119 | [react-native-reanimated-carousel](https://github.com/dohooo/react-native-reanimated-carousel) | 3.5.1 | - | [react-native-reanimated-carousel](https://github.com/dohooo/react-native-reanimated-carousel/releases) | [链接](/zh-cn/react-native-reanimated-carousel.md) | +| 120 | [@react-native-community/toolbar-android](https://github.com/react-native-toolbar-android/toolbar-android) | 0.2.1 | 是 | [@react-native-community/toolbar-android](https://github.com/react-native-oh-library/toolbar-android/releases) | [链接](/zh-cn/react-native-toolbar-android.md) | +| 121 | [react-redux](https://github.com/reduxjs/react-redux) | 9.1.1 | - | [react-redux](https://github.com/reduxjs/react-redux/releases) | [链接](/zh-cn/react-redux.md) | +| 122 | [react-native-MJRefresh](https://github.com/react-native-studio/react-native-MJRefresh) | 0.7.0 | - | [react-native-MJRefresh](https://github.com/react-native-oh-library/react-native-MJRefresh/releases) | [链接](/zh-cn/react-native-MJRefresh.md) | + ## 社区 [Github Organization: react-native-oh-library](https://github.com/react-native-oh-library) + diff --git a/zh-cn/react-native-MJRefresh.md b/zh-cn/react-native-MJRefresh.md new file mode 100644 index 0000000000000000000000000000000000000000..210b7c3426ea456207bfa436fed9e2cdfc28f6db --- /dev/null +++ b/zh-cn/react-native-MJRefresh.md @@ -0,0 +1,284 @@ +> 模板版本:v0.1.3 + +

+

react-native-MJRefresh

+

+

+ + Supported platforms + + + License + + +

+ +> [!TIP] [Github 地址](https://github.com/react-native-oh-library/react-native-MJRefresh) + +## 安装与使用 + +请到三方库的 Releases 发布地址查看配套的版本信息:[<@react-native-oh-library/react-native-MJRefresh> Releases](https://github.com/react-native-oh-library/react-native-MJRefresh/releases),并下载适用版本的 tgz 包。 + +进入到工程目录并输入以下命令: + +> [!TIP] # 处替换为 tgz 包的路径 + + + +#### npm + +```bash +npm install @react-native-oh-tpl/react-native-mjrefresh@file:# +``` + +#### yarn + +```bash +yarn add @react-native-oh-tpl/react-native-mjrefresh@file:# +``` + + + +下面的代码展示了这个库的基本使用场景: + +> [!WARNING] 使用时 import 的库名不变。 + +```tsx +import React, { useState } from "react"; +import { ScrollView, Text, View } from "react-native"; +import { MJRefreshControl } from "react-native-mjrefresh"; + +export const MjRefreshDemo = () => { + const [state, setState] = useState<{ + message?: string; + }>({ + message: "", + }); + const { message } = state; + let mjRefreshRef: React.RefObject; + return ( + + (this.mjRefreshRef = ref)} + onRefresh={() => { + setState({ message: "正在刷新" }); + console.log("------------onRefresh"); + // 开始刷新 + this.mjRefreshRef.beginRefresh(); + // 自定义刷新结束事件 + setTimeout(() => { + console.log("------------ Finish Refresh"); + // 结束刷新 + this.mjRefreshRef.finishRefresh(); + }, 2000); + }} + onRefreshIdle={() => { + setState({ message: "下拉刷新" }); + console.log("------------onRefreshIdle"); + }} + onReleaseToRefresh={() => { + setState({ message: "释放刷新" }); + console.log("------------onReleaseToRefresh"); + }} + onPulling={() => { + setState({ message: "下拉刷新" }); + console.log("------------onPulling"); + }} + > + } + > + Refresh State:{message} + + ); +}; +``` + +## Link + +目前鸿蒙暂不支持 AutoLink,所以 Link 步骤需要手动配置。 + +首先需要使用 DevEco Studio 打开项目里的鸿蒙工程 `harmony` + +### 引入原生端代码 + +目前有两种方法: + +1. 通过 har 包引入(在 IDE 完善相关功能后该方法会被遗弃,目前首选此方法); +2. 直接链接源码。 + +方法一:通过 har 包引入 + +> [!TIP] har 包位于三方库安装路径的 `harmony` 文件夹下。 + +打开 `entry/oh-package.json5`,添加以下依赖 + +```json +"dependencies": { + "rnoh": "file:../rnoh", + "rnoh-mjrefresh": "file:../../node_modules/@react-native-oh-tpl/react-native-mjrefresh/harmony/mjrefresh.har" + } +``` + +点击右上角的 `sync` 按钮 + +或者在终端执行: + +```bash +cd entry +ohpm install +``` + +方法二:直接链接源码 + +> [!TIP] 源码位于三方库安装路径的 `harmony` 文件夹下。 + +打开 `entry/oh-package.json5`,添加以下依赖 + +```json +"dependencies": { + "rnoh": "file:../rnoh", + "rnoh-mjrefresh": "file:../../node_modules/@react-native-oh-tpl/react-native-mjrefresh/harmony/mjrefresh" + } +``` + +打开终端,执行: + +```bash +cd entry +ohpm install --no-link +``` + +### 配置 CMakeLists 和引入 MJRefreshPackge + +打开 `entry/src/main/cpp/CMakeLists.txt`,添加: + +```diff +txtproject(rnapp) +cmake_minimum_required(VERSION 3.4.1) +set(RNOH_APP_DIR "${CMAKE_CURRENT_SOURCE_DIR}") +set(OH_MODULE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules") +set(RNOH_CPP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../react-native-harmony/harmony/cpp") + +add_subdirectory("${RNOH_CPP_DIR}" ./rn) + +# RNOH_BEGIN: add_package_subdirectories +add_subdirectory("../../../../sample_package/src/main/cpp" ./sample-package) ++ add_subdirectory("${OH_MODULE_DIR}/rnoh-mjrefresh/src/main/cpp" ./mjrefresh) +# RNOH_END: add_package_subdirectories + +add_library(rnoh_app SHARED + "./PackageProvider.cpp" + "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp" +) + +target_link_libraries(rnoh_app PUBLIC rnoh) + +# RNOH_BEGIN: link_packages +target_link_libraries(rnoh_app PUBLIC rnoh_sample_package) ++ target_link_libraries(rnoh_app PUBLIC rnoh_mjrefresh) +# RNOH_END: link_packages +``` + +打开 `entry/src/main/cpp/PackageProvider.cpp`,添加: + +```diff +#include "RNOH/PackageProvider.h" +#include "SamplePackage.h" ++ #include "MJRefreshPackage.h" + +using namespace rnoh; + +std::vector> PackageProvider::getPackages(Package::Context ctx) { + return { + std::make_shared(ctx), ++ std::make_shared(ctx), + }; +} +``` + +### 在 ArkTs 侧引入 MJRefresh组件 + +找到 **function buildCustomComponent()**,一般位于 `entry/src/main/ets/pages/index.ets` 或 `entry/src/main/ets/rn/LoadBundle.ets`,添加: + +```diff +... ++ import { MJRefresh, MJREFRESH_TYPE} from "rnoh-mjrefresh" + + @Builder + function buildCustomComponent(ctx: ComponentBuilderContext) { + if (ctx.componentName === SAMPLE_VIEW_TYPE) { + SampleView({ + ctx: ctx.rnComponentContext, + tag: ctx.tag, + buildCustomComponent: buildCustomComponent + }) + } ++ else if (ctx.componentName === MJREFRESH_TYPE) { ++ MJRefresh({ ++ ctx: ctx.rnComponentContext, ++ tag: ctx.tag, ++ buildCustomComponent: buildCustomComponent ++ }) ++ } + ... + } + ... +``` + +### 运行 + +点击右上角的 `sync` 按钮 + +或者在终端执行: + +```bash +cd entry +ohpm install +``` + +然后编译、运行即可。 + +## 约束与限制 + +### 兼容性 + +要使用此库,需要使用正确的 React-Native 和 RNOH 版本。另外,还需要使用配套的 DevEco Studio 和 手机 ROM。 + +请到三方库相应的 Releases 发布地址查看 Release 配套的版本信息:[<@react-native-oh-library/react-native-MJRefresh> Releases](https://github.com/react-native-oh-library/react-native-MJRefresh/releases) + +## 属性 + +> [!tip] "Platform"列表示该属性在原三方库上支持的平台。 + +> [!tip] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。 + +详情请见[react-native-MJRefresh](https://github.com/react-native-studio/react-native-MJRefresh) + +| Name | Description | Type | Required | Platform | HarmonyOS Support | +| :----------------- | ----------- | -------- | -------- | -------- | ----------------- | +| onRefresh | System Path | function | No | IOS | yes | +| onRefreshIdle | System Path | function | No | IOS | yes | +| onReleaseToRefresh | System Path | function | No | IOS | yes | +| onPulling | System Path | function | No | IOS | yes | + +## 静态方法 + +> [!tip] "Platform"列表示该属性在原三方库上支持的平台。 + +> [!tip] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。 + +详情请见[react-native-MJRefresh](https://github.com/react-native-studio/react-native-MJRefresh) + +| Name | Description | Type | Required | Platform | HarmonyOS Support | +| :------------ | ----------- | -------- | -------- | -------- | ----------------- | +| beginRefresh | System Path | function | No | IOS | yes | +| finishRefresh | System Path | function | No | IOS | yes | + +## 其他 + +## 开源协议 + +本项目基于 [The MIT License (MIT)](https://github.com/react-native-studio/react-native-MJRefresh/blob/master/LICENSE) ,请自由地享受和参与开源。 diff --git a/zh-cn/react-native-aria.md b/zh-cn/react-native-aria.md new file mode 100644 index 0000000000000000000000000000000000000000..9e505a98993889ce01bfb0f851e605b574fcb7ef --- /dev/null +++ b/zh-cn/react-native-aria.md @@ -0,0 +1,568 @@ +> 模板版本:v0.1.3 + +

+

react-native-aria

+

+

+ + Supported platforms + + + License + +

+ +> [!tip] [Github 地址](https://github.com/gluestack/react-native-aria/tree/v0.2.4) + +## 安装与使用 + +React Native ARIA是可增量采用的。每个组件都作为单独的包发布,因此您可以在单个组件中使用它,并随着时间的推移逐渐添加更多组件。所有这些包都在npm上的@react-native-aria范围内发布。 + +进入到工程目录并输入以下命令: + +#### **yarn** + +```bash +yarn add @react-native-aria/button@0.2.2 +``` + + + +#### **npm** + +```bash +npm install @react-native-aria/button@0.2.2 +``` + + + +除了单独的包之外,我们还提供了一个总包,其中包含所有React Native ARIA hooks + +#### **yarn** + +```bash +yarn add react-native-aria@0.2.2 +``` + + + +#### **npm** + +```bash +npm install react-native-aria@0.2.2 +``` + + + +下面的代码展示了useToggleButton的基本使用场景: + +```js +import React from "react"; +import { useToggleButton } from "@react-native-aria/button"; +import { Pressable, Text, View } from "react-native"; +import { useToggleState } from "@react-stately/toggle"; +import { useRef } from "react"; + +export function ToggleButton(props) { + const ref = useRef(null); + let state = useToggleState(props); + let { buttonProps, isPressed } = useToggleButton(props, state, ref); //useToggleButton 是一个用于创建可切换按钮的 Hook,接受三个参数 + + return ( + + + + A simple toggle button + + + + + + {state.isSelected ? "Selected" : "Not Selected"} + + + + ); +} + +export default function AriaDemo() { + return ( + + Toggle button + + ); +} +``` + +下面的代码展示了useCheckbox与useCheckboxGroup的基本使用场景: + +```javascript +import React ,{ useContext, useRef }from 'react'; +import {useCheckboxGroupState} from '@react-stately/checkbox'; +import {useCheckbox, useCheckboxGroup,useCheckboxGroupItem} from '@react-native-aria/checkbox'; +import {Platform, Pressable, Text, View} from 'react-native'; +import {VisuallyHidden} from '@react-aria/visually-hidden'; +import {useFocusRing} from '@react-native-aria/focus'; +let CheckboxGroupContext = React.createContext(null); + +export function CheckboxGroup(props: any) { + let {children, label} = props; + let state = useCheckboxGroupState(props); + let {checkboxgroupProps, labelProps} = useCheckboxGroup(props, state); + + return ( + + {label && {label}} + + {children} + + + ); +} +export function Checkbox(props: any) { + + let state = useContext(CheckboxGroupContext); + const inputRef = React.useRef(null); + let {isFocusVisible, focusProps} = useFocusRing(); + let { inputProps } = state + ? + useCheckboxGroupItem( + { + ...props, + isRequired: props.isRequired, + validationState: props.validationState, + }, + state, + inputRef + ) + : + useCheckbox(props, useToggleState(props), inputRef); + return ( + <> + + + + {props.children} + + {inputProps.checked ? 'selected' : 'not selected'} + + + ); +} + +export default function CheckboxDemo() { + return ( + + + Dogs + Cats + rabbits + + + ); +} + +``` + +下面的代码展示了useRadio与useRadioGroup的基本使用场景: + +```javascript +import React from "react"; +import { useRadioGroupState } from "@react-stately/radio"; +import { useRadio, useRadioGroup } from "@react-native-aria/radio"; +import { Platform, Pressable, Text, View } from "react-native"; +import { VisuallyHidden } from "@react-aria/visually-hidden"; +import { useFocusRing } from "@react-native-aria/focus"; + +let RadioContext = React.createContext({}); + +export function RadioGroup(props: any) { + let { children, label } = props; + let state = useRadioGroupState(props); + let { radioGroupProps, labelProps } = useRadioGroup(props, state); + + return ( + + {label} + + {children} + + + ); +} + +export function Radio(props: any) { + let { state, isReadOnly, isDisabled } = React.useContext(RadioContext); + const inputRef = React.useRef(null); + let { inputProps } = useRadio( + { isReadOnly, isDisabled, ...props }, + state, + inputRef + ); + let { isFocusVisible, focusProps } = useFocusRing(); + + let isSelected = state.selectedValue === props.value; + + return ( + <> + + + + + + {props.children} + + {isSelected ? "selected" : "not selected"} + + + ); +} + +export default function RadioDemo() { + return ( + + + Dogs + Cats + + + ); +} +``` + +下面的代码展示了useSwitch的基本使用场景: + +```javascript +import { useToggleState } from "@react-stately/toggle"; +import React, { useRef } from "react"; +import { + StyleSheet, + Text, + View, + Animated, + Platform, + Pressable, +} from "react-native"; +import { useSwitch } from "@react-native-aria/switch"; +import { useFocusRing } from "@react-native-aria/focus"; +import { VisuallyHidden } from "@react-aria/visually-hidden"; + +const calculateDimensions = (size: any) => { + switch (size) { + case "small": + return { + width: 40, + padding: 10, + circleWidth: 15, + circleHeight: 15, + translateX: 22, + }; + case "large": + return { + width: 70, + padding: 20, + circleWidth: 30, + circleHeight: 30, + translateX: 38, + }; + default: + return { + width: 46, + padding: 12, + circleWidth: 18, + circleHeight: 18, + translateX: 26, + }; + } +}; +const defaultProps = { + isOn: false, + onColor: "#4cd137", + offColor: "#ecf0f1", + size: "medium", + labelStyle: {}, + thumbOnStyle: {}, + thumbOffStyle: {}, + trackOnStyle: {}, + trackOffStyle: {}, + icon: null, + disabled: false, + animationSpeed: 300, + useNativeDriver: true, + circleColor: "white", +}; +export function Switch(origProps: any) { + const props = { + ...defaultProps, + ...origProps, + }; + + const offsetX = useRef(new Animated.Value(0)); + const dimensions = useRef(calculateDimensions(props.size)); + + const createToggleSwitchStyle = () => [ + { + justifyContent: "center", + width: dimensions.current.width, + borderRadius: 20, + padding: dimensions.current.padding, + backgroundColor: props.isOn ? props.onColor : props.offColor, + }, + props.isOn ? props.trackOnStyle : props.trackOffStyle, + ]; + + const createInsideCircleStyle = () => [ + { + alignItems: "center", + justifyContent: "center", + margin: Platform.OS === "web" ? 0 : 4, + left: Platform.OS === "web" ? 4 : 0, + position: "absolute", + backgroundColor: props.circleColor, + transform: [{ translateX: offsetX.current }], + width: dimensions.current.circleWidth, + height: dimensions.current.circleHeight, + borderRadius: dimensions.current.circleWidth / 2, + shadowColor: "#000", + shadowOffset: { + width: 0, + height: 2, + }, + shadowOpacity: 0.2, + shadowRadius: 2.5, + elevation: 1.5, + }, + props.isOn ? props.thumbOnStyle : props.thumbOffStyle, + ]; + + const { isOn, icon } = props; + + const toValue = isOn + ? dimensions.current.width - dimensions.current.translateX + : 0; + + Animated.timing(offsetX.current, { + toValue, + duration: props.animationSpeed, + useNativeDriver: props.useNativeDriver, + }).start(); + + return ( + + + {icon} + + {isOn ? "on" : "off"} + + ); +} + +const styles = StyleSheet.create({ + container: { + alignItems: "center", + }, + labelStyle: { + marginHorizontal: 10, + }, +}); + +export function ControlledSwitch() { + const state = useToggleState(); + const { isFocusVisible, focusProps } = useFocusRing(); + const inputRef = useRef(null); + let { inputProps } = useSwitch( + { "aria-label": "Example switch" }, + state, + inputRef + ); + return ( + + + + + + ); + } +export default function SwitchDemo () { + return ( + + + + ); +} + +``` + +下面的代码展示了useOverlayPosition的基本使用场景: + +```javascript +import React from "react"; +import { + OverlayContainer, + useOverlayPosition, + OverlayProvider, +} from "@react-native-aria/overlays"; +import { + View, + Text, + Pressable, + TouchableWithoutFeedback, + StyleSheet, +} from "react-native"; + +// Button to close overlay on outside click +function CloseButton(props) { + return ( + + + + ); +} + +const OverlayView = ({ triggerRef, placement }) => { + let overlayRef = React.useRef(); + + const { overlayProps } = useOverlayPosition({ + placement, + targetRef: triggerRef, + overlayRef, + offset: 10, + }); + + return ( + + + Hello World + + + ); +}; + +function Trigger({ placement }) { + let triggerRef = React.useRef(); + const [visible, setVisible] = React.useState(false); + const toggleVisible = () => { + setVisible(!visible); + }; + + return ( + + + + Trigger + + + {visible && ( + + + + + )} + + ); +} + +export default function OverlaysDemo() { + return ( + + + + + ); +} + +const styles = StyleSheet.create({ + wrapper: { + height: 500, + alignItems: "center", + justifyContent: "center", + }, + trigger: { + flexDirection: "row", + borderWidth: 1, + paddingHorizontal: 10, + paddingVertical: 10, + }, +}); +``` + +更多hooks请参考[react-native-aria官方文档](https://geekyants.github.io/react-native-aria/docs/) + +## 约束与限制 + +## 兼容性 + +本文档内容基于以下版本验证通过: + +1. RNOH:0.72.13; SDK:HarmonyOS NEXT Developer Preview1; IDE:DevEco Studio 4.1.3.500; ROM:2.0.0.59; + +## 属性 + +> [!tip] "Platform"列表示该属性在原三方库上支持的平台。 + +> [!tip] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。 + +以下属性已验证,详情见 [react-native-aria官方文档](https://geekyants.github.io/react-native-aria/docs/) + +> + +### Hooks + +| Name | Description | Type | Platform | HarmonyOS Support | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | -------- | ----------------- | +| useToggleButton | Provides the behavior and accessibility implementation for a toggle button component. ToggleButtons allow users to toggle a selection on or off, for example switching between two states or modes. | Function | All | yes | +| useCheckbox | Provides the behavior and accessibility implementation for a checkbox component. Checkboxes allow users to select multiple items from a list of individual items, or to mark one individual item as selected. | Function | All | yes | +| useCheckboxGroup | Provides the behavior and accessibility implementation for a checkbox group component. Checkbox groups allow users to select multiple items from a list of options. | Function | All | yes | +| useRadioGroup | Provides the behavior and accessibility implementation for a radio group component. Radio groups allow users to select a single item from a list of mutually exclusive options. | Function | All | yes | +| useSwitch | Provides the behavior and accessibility implementation for a switch component. A switch is similar to a checkbox, but represents on/off values as opposed to selection. | Function | All | yes | +| OverlayContainer | Provides React Portal like functionality for React Native apps which can be useful for displaying absolutely positioned components like Menu, Tooltip, Popover. | Function | All | yes | +| useOverlayPosition | Handles positioning overlays like popovers and menus relative to a trigger element, and updating the position when the window resizes. | Function | All | yes | + +## 遗留问题 + +## 其他 + +## 开源协议 + +本项目基于 [The MIT License (MIT)](https://github.com/gluestack/react-native-aria/blob/main/LICENSE),请自由地享受和参与开源。 diff --git a/zh-cn/react-native-drag-sort.md b/zh-cn/react-native-drag-sort.md new file mode 100644 index 0000000000000000000000000000000000000000..9b980bc94e799eef760738e3472b1d5a24a0f584 --- /dev/null +++ b/zh-cn/react-native-drag-sort.md @@ -0,0 +1,645 @@ +> 模板版本:v0.1.3 + +

+

react-native-drag-sort

+

+

+ + Supported platforms + + + License + + +

+ +> [!tip] [Github 地址](https://github.com/mochixuan/react-native-drag-sort) + +## 安装与使用 + +进入到工程目录并输入以下命令: + +#### **yarn** + +```bash +yarn add react-native-drag-sort@2.4.4 +``` + +#### **npm** + +```bash +npm i react-native-drag-sort@2.4.4 +``` + +### Tip + +> Use priority: DragSortableView > AutoDragSortableView > AnySizeDragSortableView + +- 1、If the width and height are fixed and there is no need to slide, use DragSortableView. +- 2、If the width and height are fixed and you need to slide, use AutoDragSortableView. +- 3、If the width and height are arbitrary and need to slide, please use AnySizeDragSortableView. + +下面的代码展示了这个库的基本使用场景: + +##### DragSortableView组件使用 + +```js +import React, { useState } from "react"; +import { View, Text, StyleSheet, SafeAreaView } from "react-native"; +import { DragSortableView } from "react-native-drag-sort"; +//此案例id1、id2不支持拖拽 +const Dragsort = () => { + const [data, setData] = useState([ + { + id: 1, + title: "固定任务 1", + }, + { + id: 2, + title: "固定任务 2", + }, + { + id: 3, + title: "任务 3", + }, + { + id: 4, + title: "任务 4", + }, + { + id: 5, + title: "任务 5", + }, + { + id: 6, + title: "任务 6", + }, + { + id: 7, + title: "任务 7", + }, + { + id: 8, + title: "任务 8", + }, + ]); + + return ( + + + DragSortableView + + item.id} + onClickItem={(data, item, index) => { + console.log("点击了第", index, "个元素"); + }} + onDragStart={() => console.log("Drag started")} + onDragEnd={() => console.log("Drag end")} + onDataChange={() => { + console.log("数据发生变化"); + }} + fixedItems={[0, 1]} + delayLongPress={100} + isDragFreely={true} + maxScale={1.2} + minOpacity={0.7} + renderItem={(item, index) => { + return ( + + {item.title} + + ); + }} + sortable={true} + /> + + ); +}; + +const styles = StyleSheet.create({ + box: { + // position:'relative', + // flexDirection: "column", + justifyContent: "center", + alignContent: "center", + borderRadius: 5, + margin: 20, + backgroundColor: "#4e71f2", + height: 50, + width: 100, + }, + text: { + fontSize: 18, + color: "#fff", + textAlign: "center", + }, + header: { + height: 48, + justifyContent: "center", + alignItems: "center", + borderBottomColor: "#2ecc71", + borderBottomWidth: 2, + }, + header_title: { + color: "#333", + fontSize: 24, + fontWeight: "bold", + }, +}); +export default Dragsort; +``` + +##### AutoDragSortableView组件使用 + +```js +//此案例Item1、Item2不支持拖拽 +import React, { useState } from "react"; +import { View, Text } from "react-native"; +import { AutoDragSortableView } from "react-native-drag-sort"; + +const AutoDragSortDemo = () => { + const [data, setData] = useState([ + { id: "1", text: "Item 1" }, + { id: "2", text: "Item 2" }, + { id: "3", text: "Item 3" }, + { id: "4", text: "Item 4" }, + { id: "5", text: "Item 5" }, + { id: "6", text: "Item 6" }, + { id: "7", text: "Item 7" }, + { id: "8", text: "Item 8" }, + { id: "9", text: "Item 9" }, + { id: "10", text: "Item 10" }, + { id: "11", text: "Item 11" }, + { id: "12", text: "Item 12" }, + { id: "13", text: "Item 13" }, + { id: "14", text: "Item 14" }, + { id: "15", text: "Item 15" }, + { id: "16", text: "Item 16" }, + { id: "17", text: "Item 17" }, + { id: "18", text: "Item 18" }, + { id: "19", text: "Item 19" }, + { id: "20", text: "Item 20" }, + { id: "21", text: "Item 21" }, + { id: "22", text: "Item 22" }, + { id: "23", text: "Item 23" }, + { id: "24", text: "Item 24" }, + { id: "25", text: "Item 25" }, + { id: "26", text: "Item 26" }, + { id: "27", text: "Item 27" }, + { id: "28", text: "Item 28" }, + ]); + const renderHeaderView = ( + + + 标题 + + + ); + const renderBottomView = ( + + + 底部 + + + ); + + return ( + { + console.log("数据发生变化"); + }} + keyExtractor={(item, index) => item.id} + onClickItem={(data, item, index) => { + console.log("点击了第", index, "个元素"); + }} + renderItem={(item, index) => { + return ( + + {item.text} + + ); + }} + scaleDuration={500} //拖拽项缩放效果的持续时间 + slideDuration={200} //拖拽项滑动效果的持续时间 + autoThrottle={100} //自动滑动到目的地的间隔时间 + autoThrottleDuration={500} //自动滑动到目的地的持续时间 + sortable={true} + isDragFreely={false} + fixedItems={[0, 1]} + delayLongPress={100} + onDragStart={() => console.log("Drag started")} + onDragEnd={() => console.log("Drag end")} + renderHeaderView={renderHeaderView} + headerViewHeight={50} + scrollIndicatorInsets={{ top: 0, left: 0, bottom: 0, right: 0 }} + renderBottomView={renderBottomView} + bottomViewHeight={50} + onScrollListener={(event) => { + console.log("滚动事件", event); + }} + onScrollRef={(ref) => { + console.log("滚动容器", ref); + }} + /> + ); +}; + +export default AutoDragSortDemo; +``` + +##### AnySizeDragSortableView组件使用 + +```js +import React, { createRef } from "react"; +import { + Text, + TouchableOpacity, + StyleSheet, + View, + Image, + Dimensions, + SafeAreaView, +} from "react-native"; +import { AnySizeDragSortableView } from "react-native-drag-sort"; + +const { width } = Dimensions.get("window"); +const headerViewHeight = 160; +const bottomViewHeight = 40; + +const getW = (index, isWidth) => + isWidth ? (index % 3 === 0 ? width - 40 : (width - 60) / 2) : 80; + +export default class AnySizeDragSortDemo extends React.Component { + constructor(props) { + super(props); + const items = []; + for (let i = 0; i < 26; i++) { + items.push({ + text: String.fromCharCode(65 + i), + width: getW(i, true), + height: getW(i, false), + }); + } + this.state = { + items, + movedKey: null, + }; + + this.sortableViewRef = createRef(); + } + + onDeleteItem = (item, index) => { + const items = [...this.state.items]; + items.splice(index, 1); + this.setState({ items }); + }; + + _renderItem = (item, index, isMoved) => { + const { movedKey } = this.state; + return ( + { + this.setState({ movedKey: item.text }); + this.sortableViewRef.current.startTouch(item, index); + }} + onPressOut={() => this.sortableViewRef.current.onPressOut()} + > + + { + + this.onDeleteItem(item, index)}> + + + + } + + {isMoved ? ( + + + + ) : null} + + {item.text} + + + + + ); + }; + + render() { + const { items } = this.state; + const renderHeaderView = ( + + + + mochixuan + + Android, React-Native, Flutter, React, Web。Learn new knowledge and + share new knowledge. + + + + ); + const renderBottomView = ( + + yarn add react-native-drag-sort + + ); + return ( + <> + + AnySize + + item.text} + renderItem={this._renderItem} + onDataChange={(data, callback) => { + this.setState({ items: data }, () => { + callback(); + console.log("移动了"); + }); + }} + renderHeaderView={renderHeaderView} + headerViewHeight={headerViewHeight} + renderBottomView={renderBottomView} + bottomViewHeight={bottomViewHeight} + movedWrapStyle={styles.item_moved} + onDragEnd={() => console.log("Drag end")} + scrollIndicatorInsets={{ top: 1, left: 1, bottom: 1, right: 1 }} + autoThrottle={100} + autoThrottleDuration={500} + areaOverlapRatio={0.5} + childMarginTop={10} + childMarginBottom={10} + childMarginLeft={10} + childMarginRight={10} + /> + + ); + } +} + +const styles = StyleSheet.create({ + item_wrap: { + position: "relative", + paddingLeft: 20, + paddingTop: 20, + }, + item: { + justifyContent: "space-around", + alignItems: "center", + backgroundColor: "#f39c12", + borderRadius: 4, + }, + item_clear_wrap: { + position: "absolute", + left: 10, + top: 10, + width: 20, + height: 20, + zIndex: 999, + }, + item_clear: { + width: 20, + height: 20, + }, + item_moved: { + opacity: 0.95, + borderRadius: 4, + }, + item_icon_swipe: { + width: 50, + height: 50, + backgroundColor: "#fff", + borderRadius: 50 * 0.5, + justifyContent: "center", + alignItems: "center", + }, + item_icon: { + width: 30, + height: 30, + resizeMode: "contain", + }, + item_text_swipe: { + backgroundColor: "#fff", + width: 56, + height: 30, + borderRadius: 15, + justifyContent: "center", + alignItems: "center", + }, + item_text: { + color: "#444", + fontSize: 20, + fontWeight: "bold", + }, + header: { + height: 48, + justifyContent: "center", + alignItems: "center", + borderBottomColor: "#2ecc71", + borderBottomWidth: 2, + }, + header_title: { + color: "#333", + fontSize: 24, + fontWeight: "bold", + }, + aheader: { + height: headerViewHeight, + flexDirection: "row", + borderBottomColor: "#2ecc71", + borderBottomWidth: 2, + zIndex: 100, + backgroundColor: "#fff", + }, + aheader_img: { + width: headerViewHeight * 0.6, + height: headerViewHeight * 0.6, + resizeMode: "cover", + borderRadius: headerViewHeight * 0.3, + marginLeft: 16, + marginTop: 10, + }, + aheader_context: { + marginLeft: 8, + height: headerViewHeight * 0.4, + marginTop: 10, + }, + aheader_title: { + color: "#333", + fontSize: 20, + marginBottom: 10, + fontWeight: "bold", + }, + aheader_desc: { + color: "#444", + fontSize: 16, + width: width - headerViewHeight * 0.6 - 32, + }, + abottom: { + justifyContent: "center", + alignItems: "center", + height: bottomViewHeight, + backgroundColor: "#fff", + zIndex: 100, + borderTopColor: "#2ecc71", + borderTopWidth: 2, + }, + abottom_desc: { + color: "#333", + fontSize: 20, + fontWeight: "bold", + }, +}); +``` + +## 约束与限制 + +### 兼容性 + +在下述版本验证通过: + +1. RNOH:0.72.13; SDK:HarmonyOS NEXT Developer Preview1(2.0.0.59); IDE:DevEco Studio 4.1.3.500; ROM:2.0.0.58; + +### 权限要求 + +## API(AutoDragSortableView、DragSortableView) + +**isRequired if there is a \* in the name field** + +> [!tip] "Platform"列表示该属性在原三方库上支持的平台。 + +> [!tip] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。 +> +> 详情见 [react-native-drag-sort 源库地址](https://github.com/mochixuan/react-native-drag-sort) + +| Name | Description | Type | Required | Platform | HarmonyOS Support | +| :----------------------: | :---------------------------------------------------------------------: | :------: | :------: | :---------: | :---------------: | +| **dataSource** \* | | array | Yes | iOS/Android | Yes | +| **parentWidth** | parent width | number | No | iOS/Android | Yes | +| **childrenHeight** \* | Each item height | number | Yes | iOS/Android | Yes | +| **childrenWidth** \* | Each item width | number | Yes | iOS/Android | Yes | +| **marginChildrenTop** | So the item's outermost view adds margin, you can only use this method. | number | No | iOS/Android | Yes | +| **marginChildrenBottom** | | number | No | iOS/Android | Yes | +| **marginChildrenLeft** | | number | No | iOS/Android | Yes | +| **marginChildrenRight** | | number | No | iOS/Android | Yes | +| **sortable** | Do not allow dragging | bool | No | iOS/Android | Yes | +| **onClickItem** | click | function | No | iOS/Android | Yes | +| **onDragStart** | | function | No | iOS/Android | Yes | +| **onDragEnd** | | function | No | iOS/Android | Yes | +| **onDataChange** | This method is called every time the data changes. | function | No | iOS/Android | Yes | +| **renderItem** \* | render item view | function | Yes | iOS/Android | Yes | +| **fixedItems** | no remove | array | No | iOS/Android | Yes | +| **keyExtractor** | (item,index) => key | function | No | iOS/Android | Yes | +| **delayLongPress** | | number | No | iOS/Android | Yes | +| **isDragFreely** | Whether to limit the drag space | bool | No | iOS/Android | Yes | +| **onDragging** | | function | No | iOS/Android | Yes | +| **maxScale** | | number | No | iOS/Android | Yes | +| **minOpacity** | | number | No | iOS/Android | Yes | + +#### The following attributes belong only to AutoDragSortableView + +| Name | Description | Type | Required | Platform | HarmonyOS Support | +| :-----------------------: | :---------: | :------------------------------------------------------: | :------: | :---------: | :---------------: | +| **scaleDuration** | | number | No | iOS/Android | Yes | +| **slideDuration** | | number | No | iOS/Android | Yes | +| **autoThrottle** | | number | No | iOS/Android | Yes | +| **autoThrottleDuration** | | number | No | iOS/Android | Yes | +| **renderHeaderView** | | element | No | iOS/Android | Yes | +| **headerViewHeight** | | number | No | iOS/Android | Yes | +| **scrollIndicatorInsets** | | ({top:number, left:number, bottom:number, right:number}) | No | iOS/Android | Yes | +| **renderBottomView** | | element | No | iOS/Android | Yes | +| **bottomViewHeight** | | number | No | iOS/Android | Yes | +| **onScrollListener** | | (event: NativeSyntheticEvent) => void | No | iOS/Android | Yes | +| **onScrollRef** | | (ref: any) => void | No | iOS/Android | Yes | + +## **API(AnySizeDragSortableView)** + +| Name | Description | Type | Required | Platform | HarmonyOS Support | +| :-----------------------: | :-----------------------------------------------: | :------------------------------------------------------: | :------: | :---------: | :---------------: | +| **renderItem** \* | render item view | function | Yes | iOS/Android | Yes | +| **onDataChange** | This method is called every time the data changes | function | No | iOS/Android | Yes | +| **renderHeaderView** | | element | No | iOS/Android | Yes | +| **headerViewHeight** | | number | No | iOS/Android | Yes | +| **bottomViewHeight** | | number | No | iOS/Android | Yes | +| **autoThrottle** | | number | No | iOS/Android | Yes | +| **autoThrottleDuration** | | number | No | iOS/Android | Yes | +| **scrollIndicatorInsets** | | ({top:number, left:number, bottom:number, right:number}) | No | iOS/Android | Yes | +| **onScrollListener** | | (event: NativeSyntheticEvent) => void | No | iOS/Android | Yes | +| **onScrollRef** | | (ref: any) => void | No | iOS/Android | Yes | +| **areaOverlapRatio** | Must be greater than 0.5 | number | No | iOS/Android | Yes | +| **movedWrapStyle** | style | StyleProp | No | iOS/Android | Yes | +| **childMarginTop** | | number | No | iOS/Android | Yes | +| **childMarginBottom** | | number | No | iOS/Android | Yes | +| **childMarginLeft** | | number | No | iOS/Android | Yes | +| **childMarginRight** | | number | No | iOS/Android | Yes | +| **autoThrottleDuration** | | number | No | iOS/Android | Yes | +| **onDragEnd** | | function | No | iOS/Android | Yes | +| **dataSource** \* | | array | Yes | iOS/Android | Yes | +| **keyExtractor** | (item,index) => key | function.isRequired | No | iOS/Android | Yes | + +## 遗留问题 + +## 其他 + +## 开源协议 + +本项目基于 [The Apache License (Apache)](https://github.com/mochixuan/react-native-drag-sort/blob/master/LICENSE) ,请自由地享受和参与开源。 diff --git a/zh-cn/react-native-fs.md b/zh-cn/react-native-fs.md new file mode 100644 index 0000000000000000000000000000000000000000..ea0fbdcce2db694a2d4b2d1b40559ade610d51dd --- /dev/null +++ b/zh-cn/react-native-fs.md @@ -0,0 +1,365 @@ +模板版本:v0.1.3 + +

+

react-native-fs

+

+

+ + Supported platforms + + + License + + +

+ +> [!TIP] [Github 地址](https://github.com/react-native-oh-library/react-native-fs) + +## 安装与使用 + +请到三方库的 Releases 发布地址查看配套的版本信息:[<@react-native-oh-library/react-native-fs> Releases](https://github.com/react-native-oh-library/react-native-fs/releases),并下载适用版本的 tgz 包。 + +进入到工程目录并输入以下命令: + +> [!TIP] # 处替换为 tgz 包的路径 + + + +#### npm + +```bash +npm install @react-native-oh-tpl/react-native-fs@file:# +``` + +#### yarn + +```bash +yarn add @react-native-oh-tpl/react-native-fs@file:# +``` + + + +下面的代码展示了这个库的基本使用场景: + +> [!WARNING] 使用时 import 的库名不变。 + +```tsx +import React, { useState } from "react"; +import { + SafeAreaView, + StyleSheet, + ScrollView, + View, + Text, + StatusBar, + TextInput, + Button, +} from "react-native"; +import FS from "react-native-fs"; +import { Colors } from "react-native/Libraries/NewAppScreen"; +function App(): React.JSX.Element { + // 参数 + const [mkdirParam, setMkdirParam] = useState(""); + // 创建文件夹接口调用 + const mkdirExample = () => { + FS.mkdir(FS.DocumentDirectoryPath + "/" + mkdirParam).then( + (result) => { + console.log("file mkdirParam: " + mkdirParam); + console.log("file Successfully created directory."); + }, + (err) => { + console.error("file mkdir: " + err.message); + }, + ); + }; + // 组件 + return ( + <> + + + + + {"React Native File Harmony Demo App"} + + + + {"mkdir"} + + setMkdirParam(mkdirParam)} + placeholderTextColor="#9a73ef" + autoCapitalize="none" + /> + + + + +