文档模板:v0.4.2

react-native-smartrefreshlayout

本项目基于 react-native-smartrefreshlayout 开发。

该第三方库的仓库已迁移至 Gitcode,且支持直接从 npm 下载,新的包名为:@react-native-ohos/react-native-smartrefreshlayout 版本所属关系如下:

三方库名称 三方库版本(npm地址) 发布信息 支持RN版本 Autolink 编译API版本 社区基线版本 源码地址
@react-native-ohos/react-native-smartrefreshlayout ~ 0.8.1(进行中) Gitcode Releases 0.82.* / 0.84.* API12+ 0.6.7 master
@react-native-ohos/react-native-smartrefreshlayout ~ 0.7.1 Gitcode Releases 0.77.* API12+ 0.6.7 br_rnoh0.77
@react-native-ohos/react-native-smartrefreshlayout ~ 0.6.9 Gitcode Releases 0.72.* API12+ 0.6.7 br_rnoh0.72
@react-native-oh-tpl/react-native-smartrefreshlayout <= 0.6.7-0.2.18@deprecated Github Releases(deprecated) 0.72.* API12+ 0.6.7 sig

简介

react-native-smartrefreshlayout 是一个基于 Android SmartRefreshLayout 封装的下拉刷新组件库,提供 SmartRefreshControl、AnyHeader、DefaultHeader、ClassicsHeader、StoreHouseHeader 等多种刷新头组件,支持下拉刷新、自动刷新、越界拖动等丰富的刷新特性与回调事件。

下载安装

进入到工程目录并输入以下命令:

npm

npm install @react-native-ohos/react-native-smartrefreshlayout

yarn

yarn add @react-native-ohos/react-native-smartrefreshlayout
是否支持autolink RN框架版本
~ 0.8.1 0.82、0.84

使用AutoLink的工程需要根据该文档配置,Autolink框架指导文档:https://gitcode.com/CPF-RN/ohos_react_native/blob/master/docs/zh-cn/Autolinking.md

如您使用的版本支持 Autolink,并且工程已接入 Autolink,可跳过ManualLink配置。

ManualLink: 此步骤为手动配置原生依赖项的指导

首先需要使用 DevEco Studio 打开项目里的 HarmonyOS 工程 harmony

1. Overrides RN SDK

为了让工程依赖同一个版本的 RN SDK,需要在工程根目录的 oh-package.json5 添加 overrides 字段,指向工程需要使用的 RN SDK 版本。替换的版本既可以是一个具体的版本号,也可以是一个模糊版本,还可以是本地存在的 HAR 包或源码目录。

关于该字段的作用请阅读官方说明

{
  "overrides": {
    "@rnoh/react-native-openharmony": "^0.84.1" // ohpm 在线版本
    // "@rnoh/react-native-openharmony" : "./react_native_openharmony.har" // 指向本地 har 包的路径
    // "@rnoh/react-native-openharmony" : "./react_native_openharmony" // 指向源码路径
  }
}

2. 引入原生端代码

目前有两种方法:

  • 通过 har 包引入;
  • 直接链接源码。

方法一:通过 har 包引入(推荐)

har 包位于三方库安装路径的 `harmony` 文件夹下。

打开 entry/oh-package.json5,添加以下依赖

"dependencies": {
    "@rnoh/react-native-openharmony": "file:../react_native_openharmony",
    "@react-native-ohos/react-native-smartrefreshlayout": "file:../../node_modules/@react-native-ohos/react-native-smartrefreshlayout/harmony/smart_refresh_layout.har"
  }

点击右上角的 sync 按钮

或者在命令行终端执行:

cd entry
ohpm install

方法二:直接链接源码

如需使用直接链接源码,请参考[直接链接源码说明](https://gitcode.com/CPF-RN/usage-docs/blob/master/zh-cn/link-source-code.md)

3. 配置 CMakeLists 和引入 SmartRefreshLayoutPackage

打开 entry/src/main/cpp/CMakeLists.txt,添加:

project(rnapp)
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_SKIP_BUILD_RPATH TRUE)
set(RNOH_APP_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set(NODE_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../node_modules")
+ set(OH_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules")
set(RNOH_CPP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../react-native-harmony/harmony/cpp")
set(LOG_VERBOSITY_LEVEL 1)
set(CMAKE_ASM_FLAGS "-Wno-error=unused-command-line-argument -Qunused-arguments")
set(CMAKE_CXX_FLAGS "-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -s -fPIE -pie")
set(WITH_HITRACE_SYSTRACE 1) # for other CMakeLists.txt files to use
add_compile_definitions(WITH_HITRACE_SYSTRACE)

add_subdirectory("${RNOH_CPP_DIR}" ./rn)

# RNOH_BEGIN: manual_package_linking_1
add_subdirectory("../../../../sample_package/src/main/cpp" ./sample-package)
+ add_subdirectory("${OH_MODULES}/@react-native-ohos/react-native-smartrefreshlayout/src/main/cpp" ./smart-refresh-layout)
# RNOH_END: manual_package_linking_1

file(GLOB GENERATED_CPP_FILES "./generated/*.cpp")

add_library(rnoh_app SHARED
    ${GENERATED_CPP_FILES}
    "./PackageProvider.cpp"
    "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp"
)
target_link_libraries(rnoh_app PUBLIC rnoh)

# RNOH_BEGIN: manual_package_linking_2
target_link_libraries(rnoh_app PUBLIC rnoh_sample_package)
+ target_link_libraries(rnoh_app PUBLIC rnoh_smart_refresh_layout)
# RNOH_END: manual_package_linking_2

打开 entry/src/main/cpp/PackageProvider.cpp,添加:

#include "RNOH/PackageProvider.h"
#include "generated/RNOHGeneratedPackage.h"
#include "SamplePackage.h"
+ #include "SmartRefreshLayoutPackage.h"

using namespace rnoh;

std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {
    return {
        std::make_shared<RNOHGeneratedPackage>(ctx),
        std::make_shared<SamplePackage>(ctx),
+       std::make_shared<SmartRefreshLayoutPackage>(ctx),
    };
}

4. 在 ArkTs 侧引入 SmartRefreshPackage

打开 entry/src/main/ets/RNPackagesFactory.ts,添加:

  ...
+ import { SmartRefreshPackage } from '@react-native-ohos/react-native-smartrefreshlayout/ts';

export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
  return [
    new SamplePackage(ctx),
+   new SmartRefreshPackage(ctx)
  ];
}

运行

点击右上角的 sync 按钮

或者在命令行终端执行:

cd entry
ohpm install

然后编译、运行即可。

约束与限制

兼容性

本文档内容基于以下版本验证通过:

  1. RNOH: 0.84.1; SDK: HarmonyOS 6.1.0 Release SDK; IDE: DevEco Studio 6.1.0.830; ROM: 6.0.0.130;

权限要求

使用示例

下面的代码展示了这个库的基本使用场景:

使用时 import 的库名不变。

import React, { useState } from "react";
import {
  View,
  Text,
  FlatList,
  StyleSheet,
  TouchableOpacity,
} from "react-native";
import {
  SmartRefreshControl,
  AnyHeader,
} from "react-native-smartrefreshlayout";

const App = () => {
  const [text, setText] = useState("状态");
  const [text1, setText1] = useState("刷新时间");

  const [headerHeight, setHeaderHeight] = useState(66);
  const [color, setColor] = useState("#fff000");

  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" },

    // ... more data ...
  ]);

  const renderItem = ({ item }) => (
    <View style={styles.item}>
      <Text style={styles.item}>{item.text}</Text>
    </View>
  );
  let smartRefreshControlRef: React.RefObject<SmartRefreshControl>;
  return (
    <View>
      <TouchableOpacity
        onPress={() => {
          smartRefreshControlRef.finishRefresh({ delayed: -1, success: true });
        }}
      >
        <Text style={{ height: 40, width: "100%", backgroundColor: "red" }}>
          finish
        </Text>
      </TouchableOpacity>

      <TouchableOpacity
        onPress={() => {
          setHeaderHeight(headerHeight == 66 ? 132 : 66);
        }}
      >
        <Text style={{ height: 40, width: "100%", backgroundColor: "pink" }}>
          切换高度 66/132
        </Text>
      </TouchableOpacity>

      <TouchableOpacity
        onPress={() => {
          setColor(color === "#fff000" ? "red" : "#fff000");
        }}
      >
        <Text style={{ height: 40, width: "100%", backgroundColor: "green" }}>
          切换颜色(正在刷新中不支持切换背景色)
        </Text>
      </TouchableOpacity>

      <Text style={{ height: 40, width: "100%", backgroundColor: "" }}>
        {text}
      </Text>
      <Text style={{ height: 40, width: "100%", backgroundColor: "" }}>
        {text1}
      </Text>
      <SmartRefreshControl
        ref={(ref) => (smartRefreshControlRef = ref)}
        primaryColor={color}
        headerHeight={headerHeight}
        style={{ height: 500, width: "100%", backgroundColor: "#ffcc00" }}
        onHeaderMoving={(e) => {
          setText("onHeaderMoving" + JSON.stringify(e.nativeEvent));
        }}
        onRefresh={() => {
          setText1("时间:" + new Date().getTime() + "onRefresh触发刷新");
        }}
        HeaderComponent={
          <AnyHeader style = {{ height: 0 }}>
            <Text style={{ height: 66, width: "100%" }}>{text}</Text>
          </AnyHeader>
        }
      >
        <FlatList
          style={{ flex: 1, height: "100%", width: "100%" }}
          bounces={false}
          data={data}
          renderItem={renderItem}
          keyExtractor={(item) => item.id.toString()}
        />
      </SmartRefreshControl>
    </View>
  );
};

const styles = StyleSheet.create({
  item: {
    padding: 16,
    borderBottomWidth: 1,
    borderBottomColor: "#ccc",
    width: 100,
    height: 100,
  },
});

export default App;

接口说明

"Platform"列表示该属性在原三方库上支持的平台。

"HarmonyOS Support"列为 yes 表示 HarmonyOS 平台支持该属性;no 则表示不支持;partially 表示部分支持。使用方法跨平台一致,效果对标 iOS 或 Android 的效果。

属性

SmartRefreshControl

名称 参数类型 默认值 必填 平台 HarmonyOS平台支持 描述
HeaderComponent Element DefaultHeader No Android Yes 用于渲染 SmartRefreshLayout 组件的 header
renderHeader Element/func DefaultHeader No Android Yes 用于渲染 SmartRefreshLayout 组件的 header
enableRefresh boolean true No Android Yes 是否启用下拉刷新
headerHeight number 0 No Android Yes 设定 header 的高度
primaryColor string none No Android Yes 设置刷新组件的主调色
autoRefresh object:{refresh?:boolean, time?:number} none No Android Yes 是否自动刷新
pureScroll boolean false No Android No 是否启用纯滚动
overScrollBounce boolean true No Android No 是否启用越界回弹
overScrollDrag boolean true No Android No 是否使用越界拖动,类似 IOS 样式
dragRate number 0.5 No Android Yes 设置组件下拉高度与手指真实下拉高度的比值
maxDragRate number 2.0 No Android Yes 设置最大显示下拉高度与 header 标准高度的比值
onLoadMore function none No Android No 上拉加载回调
onPullDownToRefresh function none No Android Yes 可下拉刷新时触发
onReleaseToRefresh function none No Android Yes 可释放刷新时触发
onRefresh function none No Android Yes 刷新时触发
onHeaderPulling ({nativeEvent: {percent:number, offset:number, headerHeight:number}})=>void none No Android Yes header 下拉过程中触发
onHeaderReleasing ({nativeEvent: {percent:number, offset:number, headerHeight:number}})=>void none No Android Yes header 释放过程中触发
onHeaderReleased function none No Android Yes Header 释放时触发
onHeaderMoving ({nativeEvent: {percent:number, offset:number, headerHeight:number}})=>void none No Android Yes header 移动过程中触发,包括下拉过程和释放过程

组件 AnyHeader

当前组件支持

名称 参数类型 默认值 必填 平台 HarmonyOS平台支持 描述
primaryColor string none No Android Yes 刷新组件 Header 的主调色

组件 DefaultHeader/ClassicsHeader

当前组件支持

名称 参数类型 默认值 必填 平台 HarmonyOS平台支持 描述
primaryColor string none No Android Yes 刷新组件 Header 的主调色
accentColor string none No Android Yes 刷新组件 Header 的强调色

组件 StoreHouseHeader

当前组件支持

名称 参数类型 默认值 必填 平台 HarmonyOS平台支持 描述
text string StoreHouse No Android Yes StoreHouseHeader 的文字(暂只支持英文)
textColor string #cccccc No Android Yes StoreHouseHeader 的文字颜色
fontSize number 25 No Android Yes StoreHouseHeader 的文字字号
lineWidth number 1 No Android Yes StoreHouseHeader 的文字线宽
dropHeight number 40 No Android Yes StoreHouseHeader 的下拉高度

组件 MeaterialHeader

当前组件支持

无自有属性(仅继承 ViewProps)。该组件为鸿蒙侧额外导出,上游 index.js 未导出 MaterialHeader。

API

名称 类型 参数类型 返回值 必填 平台 HarmonyOS平台支持 描述
SmartRefreshControl.finishRefresh function params: {delayed?:number, success?:boolean} void No Android Yes 完成刷新。delayed 为延迟时间(毫秒,-1 表示立即执行),success 表示是否刷新成功

遗留问题

其他

目录结构

/rntpc_react-native-SmartRefreshLayout  # 项目根目录
├── harmony                      # 鸿蒙适配代码
│    └─ smart_refresh_layout.har # har包
│    └─ smart_refresh_layout     # 鸿蒙适配核心代码
│          └─ index.ets          # 鸿蒙适配代码入口    
│          └─ ts.ets             # ArkTS侧导出
│          └─ src/main/cpp       # C++ 适配代码
│          └─ src/main/ets       # ArkTS 适配代码
├── src                          # RN代码
│    └─ index.tsx                # 入口文件
│    └─ SmartRefreshControl.tsx  # SmartRefreshControl 组件实现
│    └─ AnyHeader.tsx            # AnyHeader 组件实现
│    └─ fabric                   # Fabric 组件类型定义
├── README_en.md                 # 英文安装使用方法    
├── README.md                    # 中文安装使用方法                    

贡献代码

使用过程中发现任何问题都可以提交 Issue,当然,也非常欢迎提交 PR

开源协议

本项目基于 Apache License 2.0 ,请自由地享受和参与开源。