From 18daf7a7c61e9ca070283cc46f29ad5f47776f39 Mon Sep 17 00:00:00 2001 From: Magic-Neko <312651922@qq.com> Date: Thu, 18 Apr 2024 11:54:08 +0800 Subject: [PATCH] =?UTF-8?q?[Issues:=20#I9HJFB]=20=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E4=B8=89=E6=96=B9=E5=BA=93=E6=8C=87=E5=AF=BC=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 + _sidebar.md | 16 + zh-cn/README.md | 15 + zh-cn/react-native-MJRefresh.md | 284 ++++++++ zh-cn/react-native-aria.md | 568 +++++++++++++++ .../react-native-community-toolbar-android.md | 311 +++++++++ zh-cn/react-native-drag-sort.md | 645 ++++++++++++++++++ zh-cn/react-native-fs.md | 365 ++++++++++ ...react-native-keyboard-aware-scroll-view.md | 134 ++++ zh-cn/react-native-permissions.md | 432 ++++++++++++ zh-cn/react-native-progress.md | 226 ++++++ zh-cn/react-native-reanimated-carousel.md | 327 +++++++++ zh-cn/react-native-sound.md | 338 +++++++++ zh-cn/react-native-text-size.md | 414 +++++++++++ zh-cn/react-redux.md | 177 +++++ zh-cn/react-router-dom.md | 106 +++ zh-cn/redux-actions.md | 306 +++++++++ zh-cn/redux-thunk.md | 157 +++++ 18 files changed, 4836 insertions(+) create mode 100644 zh-cn/react-native-MJRefresh.md create mode 100644 zh-cn/react-native-aria.md create mode 100644 zh-cn/react-native-community-toolbar-android.md create mode 100644 zh-cn/react-native-drag-sort.md create mode 100644 zh-cn/react-native-fs.md create mode 100644 zh-cn/react-native-keyboard-aware-scroll-view.md create mode 100644 zh-cn/react-native-permissions.md create mode 100644 zh-cn/react-native-progress.md create mode 100644 zh-cn/react-native-reanimated-carousel.md create mode 100644 zh-cn/react-native-sound.md create mode 100644 zh-cn/react-native-text-size.md create mode 100644 zh-cn/react-redux.md create mode 100644 zh-cn/react-router-dom.md create mode 100644 zh-cn/redux-actions.md create mode 100644 zh-cn/redux-thunk.md diff --git a/README.md b/README.md index 99c9ba60..0ff30a6f 100644 --- a/README.md +++ b/README.md @@ -127,6 +127,21 @@ | 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/aMarCruz/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/tree/v0.2.4) | 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/oblador/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/itinance/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/APSL/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/zoontek/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/zmxv/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-toolbar-android/toolbar-android/releases) | [链接](/zh-cn/react-native-community-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-studio/react-native-MJRefresh/releases) | [链接](/zh-cn/react-native-MJRefresh.md) | ## 社区 diff --git a/_sidebar.md b/_sidebar.md index c1d57b7a..97a34b3c 100644 --- a/_sidebar.md +++ b/_sidebar.md @@ -39,6 +39,14 @@ - [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-reanimated-carousel](/zh-cn/react-native-reanimated-carousel.md) + - [@react-native-community/toolbar-android](/zh-cn/react-native-community-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 +104,10 @@ - [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-redux](/zh-cn/react-redux.md) - 纯JS库 - [crypto-js](/zh-cn/crypto-js.md) - [deepmerge](/zh-cn/deepmerge.md) @@ -113,3 +125,7 @@ - [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) + - [react-native-drag-sort](/zh-cn/react-native-drag-sort.md) diff --git a/zh-cn/README.md b/zh-cn/README.md index f99033f9..e02ebcc2 100644 --- a/zh-cn/README.md +++ b/zh-cn/README.md @@ -127,6 +127,21 @@ | 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/aMarCruz/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/tree/v0.2.4) | 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/oblador/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/itinance/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/APSL/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/zoontek/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/zmxv/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-toolbar-android/toolbar-android/releases) | [链接](/zh-cn/react-native-community-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-studio/react-native-MJRefresh/releases) | [链接](/zh-cn/react-native-MJRefresh.md) | ## 社区 diff --git a/zh-cn/react-native-MJRefresh.md b/zh-cn/react-native-MJRefresh.md new file mode 100644 index 00000000..210b7c34 --- /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 00000000..9e505a98 --- /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-community-toolbar-android.md b/zh-cn/react-native-community-toolbar-android.md new file mode 100644 index 00000000..20a1f5c7 --- /dev/null +++ b/zh-cn/react-native-community-toolbar-android.md @@ -0,0 +1,311 @@ +> 模板版本:v0.1.3 + +

+

@react-native-community/toolbar-android

+

+

+ + Supported platforms + + + License + +

+ +> [!TIP] [Github 地址](https://github.com/react-native-oh-library/toolbar-android/tree/sig) + +## 安装与使用 + +请到三方库的 Releases 发布地址查看配套的版本信息:[<@react-native-oh-tpl/toolbar-android> Releases](https://github.com/react-native-oh-library/toolbar-android/releases),并下载适用版本的 tgz 包。 + +进入到工程目录并输入以下命令: + +> [!TIP] # 处替换为 tgz 包的路径 + + + +#### npm + +```bash +npm install @react-native-oh-tpl/toolbar-android@file:# +``` + +#### yarn + +```bash +yarn add @react-native-oh-tpl/toolbar-android@file:# +``` + + + +下面的代码展示了这个库的基本使用场景: + +> [!WARNING] 使用时 import 的库名不变。 + +```tsx +import React, { useState } from "react"; +import { StyleSheet, View, Text } from "react-native"; +import ToolbarAndroid from "@react-native-community/toolbar-android"; +function App({}): JSX.Element { + const [state, setState] = useState<{ + message?: string; + }>({ + message: undefined, + }); + + const { message } = state; + + return ( + + setState({ message: "Clicked nav icon" })} + onActionSelected={(position: number) => + setState({ message: `Clicked Menu-${position}` }) + } + /> + + + Click nav or action icon will trigger some events! + + {message} + + + ); +} + +const styles = StyleSheet.create({ + container: { + flex: 1, + }, + toolbar: { + backgroundColor: "#E9EAED", + height: 56, + }, + centerContainer: { + flex: 1, + justifyContent: "center", + alignItems: "center", + backgroundColor: "#F5FCFF", + }, + headText: { + fontSize: 16, + }, + contentText: { + fontSize: 18, + fontWeight: "bold", + color: "#ff681f", + }, +}); + +export default App; +``` + +## Link + +目前鸿蒙暂不支持 AutoLink,所以 Link 步骤需要手动配置。 + +首先需要使用 DevEco Studio 打开项目里的鸿蒙工程 `harmony` + +### 引入原生端代码 + +目前有两种方法: + +1. 通过 har 包引入(在 IDE 完善相关功能后该方法会被遗弃,目前首选此方法); +2. 直接链接源码。 + +方法一:通过 har 包引入 + +> [!TIP] har 包位于三方库安装路径的 `harmony` 文件夹下。 + +打开 `entry/oh-package.json5`,添加以下依赖 + +```json +"dependencies": { + "rnoh": "file:../rnoh", + "rnoh-toolbar-android": "file:../../node_modules/@react-native-oh-tpl/toolbar-android/harmony/toolbar_android.har" + } +``` + +点击右上角的 `sync` 按钮 + +或者在终端执行: + +```bash +cd entry +ohpm install +``` + +方法二:直接链接源码 + +> [!TIP] 源码位于三方库安装路径的 `harmony` 文件夹下。 + +打开 `entry/oh-package.json5`,添加以下依赖 + +```json +"dependencies": { + "rnoh": "file:../rnoh", + "rnoh-toolbar-android": "file:../../node_modules/@react-native-oh-tpl/toolbar-android/harmony/toolbar_android" + } +``` + +打开终端,执行: + +```bash +cd entry +ohpm install --no-link +``` + +### 配置 CMakeLists 和引入 ToolbarAndroidPackage + +打开 `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-toolbar-android/src/main/cpp" ./toolbar-android) +# 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_toolbar_android) +# RNOH_END: link_packages +``` + +打开 `entry/src/main/cpp/PackageProvider.cpp`,添加: + +```diff +#include "RNOH/PackageProvider.h" +#include "SamplePackage.h" ++ #include "ToolbarAndroidPackage.h" + +using namespace rnoh; + +std::vector> PackageProvider::getPackages(Package::Context ctx) { + return { + std::make_shared(ctx), ++ std::make_shared(ctx), + }; +} +``` + +### 在 ArkTs 侧引入 RNCToolbarAndroid组件 + +找到 **function buildCustomComponent()**,一般位于 `entry/src/main/ets/pages/index.ets` 或 `entry/src/main/ets/rn/LoadBundle.ets`,添加: + +```diff +... ++ import { RNCToolbarAndroid, RNC_TOOLBAR_ANDROID_TYPE } from 'rnoh-toolbar-android/src/main/ets/RNCToolbarAndroid' + + @Builder + function buildCustomComponent(ctx: ComponentBuilderContext) { + if (ctx.componentName === SAMPLE_VIEW_TYPE) { + SampleView({ + ctx: ctx.rnComponentContext, + tag: ctx.tag, + buildCustomComponent: buildCustomComponent + }) + } ++ else if (ctx.componentName === RNC_TOOLBAR_ANDROID_TYPE) { ++ RNCToolbarAndroid({ ++ ctx: ctx.rnohContext, ++ tag: ctx.tag ++ }) ++ } + ... + } + ... + +``` + +### 运行 + +点击右上角的 `sync` 按钮 + +或者在终端执行: + +```bash +cd entry +ohpm install +``` + +然后编译、运行即可。 + +## 约束与限制 + +### 兼容性 + +要使用此库,需要使用正确的 React-Native 和 RNOH 版本。另外,还需要使用配套的 DevEco Studio 和 手机 ROM。 + +请到三方库相应的 Releases 发布地址查看 Release 配套的版本信息:[<@react-native-oh-tpl/toolbar-android> Releases](https://github.com/react-native-oh-library/toolbar-android/releases) + +## 属性 + +> [!tip] "Platform"列表示该属性在原三方库上支持的平台。 + +> [!tip] "HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。 + +Inherits [View Props](https://reactnative.dev/docs/view#props). + +| Name | Description | Type | Required | Platform | HarmonyOS Support | +| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | -------- | -------- | ----------------- | +| actions | Sets possible actions on the toolbar as part of the action menu. These are displayed as icons or text on the right side of the widget. If they don't fit they are placed in an 'overflow' menu. | array of object: {title: string,icon: ImageSource,show: enum('always', 'ifRoom', 'never'),showWithText: bool} | No | Android | yes | +| contentInsetStart | Sets the content inset for the toolbar starting edge. | number | No | Android | yes | +| contentInsetEnd | Sets the content inset for the toolbar ending edge. | number | No | Android | yes | +| logo | Sets the toolbar logo. | ImageSource | No | Android | yes | +| navIcon | Sets the navigation icon. | ImageSource | No | Android | yes | +| onActionSelected | Callback that is called when an action is selected. The only argument that is passed to the callback is the position of the action in the actions array. | function | No | Android | yes | +| onIconClicked | Callback called when the icon is selected. | function | No | Android | yes | +| overflowIcon | Sets the overflow icon. | ImageSource | No | Android | yes | +| rtl | Used to set the toolbar direction to RTL. | bool | No | Android | yes | +| subtitle | Sets the toolbar subtitle. | string | No | Android | yes | +| subtitleColor | Sets the toolbar subtitle color. | string | No | Android | yes | +| title | Sets the toolbar title. | string | Yes | Android | yes | +| titleColor | Sets the toolbar title color. | string | No | Android | yes | + +#### Props of ImageSource + +| Name | Description | Type | Required | Platform | HarmonyOS Support | +| ------ | ------------------------------------------------------ | ------ | -------- | -------- | ----------------- | +| uri | load image from a url, e.g. require('./some_icon.png') | string | Yes | android | yes | +| width | the width of the image | number | No | android | yes | +| height | the height of the image | number | No | android | yes | + +## 其他 + +## 开源协议 + +本项目基于 [The MIT License (MIT)](https://github.com/react-native-toolbar-android/toolbar-android/blob/master/LICENSE) ,请自由地享受和参与开源。 diff --git a/zh-cn/react-native-drag-sort.md b/zh-cn/react-native-drag-sort.md new file mode 100644 index 00000000..9b980bc9 --- /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 00000000..ea0fbdcc --- /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" + /> + + + + +