news 2026/10/27 0:05:09

React Native for OpenHarmony 实战:三方库 react-native-step-indicator 的鸿蒙化适配指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
React Native for OpenHarmony 实战:三方库 react-native-step-indicator 的鸿蒙化适配指南

本文记录把react-native-step-indicator(步骤条 / 进度指示器)适配到 HarmonyOS 的完整过程。

这是一个纯 JS 组件库,源码475 行,功能是"横向或纵向的步骤条",带可点击的步骤、可自定义的标签渲染,以及一条随进度增长的已完成色带。它不需要任何原生接线。

它有两个很适合做量化验证的特点,我把它们都做成了硬判据:

  1. 已完成色带的宽度可以直接算出来:

    constanimateToPosition=(progressBarSize/(stepCount-1))*position;// progressBarSize = width * (stepCount - 1) / stepCount// ⇒ 绿条宽度 = width * k / N
  2. 当前步骤的圆圈更大(默认 40 vs 30)且底色是白色,而其它步骤是实心绿 / 浅绿 ⇒白圆的圆心 x 就是currentPosition的位置:

    圆心 x = width/(2N) + k * width/N (styles.stepContainer 是 flex:1 ⇒ 等分)

实测(容器宽 1248px、N=5)三个实例全部精确命中:

实例k绿条宽度预言 / 实测当前步圆心 x预言 / 实测当前步圆尺寸
S100 /无绿条✓160.8 /161✓120px
S22499.2 /499✓660.0 /660✓120px
S34998.4 /998(满格)✓1159.2 /1159✓120px

设备侧断言13 / 13 全部通过,一次构建就过。


一、先说结论

项结果
上游最新版1.0.3;license: MIT;上游 star1459
库类型纯 JS 单组件库:StepIndicator(步骤条)
是否需要原生适配不需要(无harmony/、无NativeModules;import 图只有react/react-native/./types)
运行时依赖零(dependencies未声明);peerDependencies只有react/react-native
prepare⚠️保留了上游的"prepare": "bob build"(bob是 devDependency)⇒目录/file:接入必须--ignore-scripts
mainlib/commonjs/index(编译产物)⇒ 必须单独核对产物
导出形态只有default一个导出,且它是React.memo(...)返回的对象(typeof 'object'、无可用prototype)
需要 HAR / 权限 / ohpm❌ 都不需要
设备侧断言✅13 / 13 全部通过(A 5 + B 7 + C 1)
★ 两个像素判据✅ 绿条宽度 =W·k/N、当前步圆心 =W/(2N)+k·W/N——三个实例全部逐像素吻合
★ 当前步更大更白✅ 当前步圆120px(40vp),其余90px(30vp)
★ 交互✅ 点步骤圆 ⇒onPress(0)触发且 index 正确

二、判定与接入

步做法结果
①package.json里有没有harmony.autolinking没有
②仓库里有没有harmony/没有
③代码里有没有NativeModules/requireNativeComponent全无
④import 图体检(防@env那类坑)只有react/react-native/./types✓
npminstall"git+https://atomgit.com/oh-react-native/react-native-step-indicator.git#1.0.3-ohos-1.0.0"--ignore-scripts
// metro.config.jswatchFolders:[path.resolve(__dirname,'../react-native-step-indicator')],
importStepIndicatorTestAppfrom'./StepIndicatorTestApp';AppRegistry.registerComponent('StepIndicatorTestApp',()=>StepIndicatorTestApp);
hdc shell aa force-stop com.rnoh084.demo hdc shell aa start-bcom.rnoh084.demo-aEntryAbility--psrnAppKey StepIndicatorTestApp

不需要HAR、权限、ohpm、link-harmony。


三、读源码取到的真值(src/index.tsx,475 行)

3.1 组件形态与默认值

const StepIndicator = ({ currentPosition = 0, stepCount = 5, direction = 'horizontal', customStyles: customStylesFromProps = defaultStyles, labels = [], onPress, renderStepIndicator: renderCustomStepIndicator, renderLabel, }: StepIndicatorProps) => { … }; export default React.memo(StepIndicator);

要点:

  1. 函数组件 + 参数解构默认值⇒React 19 下没问题(不是defaultProps那类坑);
  2. 默认导出是React.memo(...)的返回值⇒typeof 'object'、没有可用的prototype;实测模块运行时只有default一个导出(Object.keys(...) = ['default']);
  3. customStyles会与defaultStyles合并({...defaultStyles, ...customStylesFromProps})。

3.2 ★ 进度条的几何与公式

// 背景条(浅绿) progressBarBackgroundStyle = { backgroundColor: customStyles.separatorUnFinishedColor, // '#a4d4a5' position: 'absolute', top: (height - separatorStrokeWidth) / 2, left: width / (2 * stepCount), right: width / (2 * stepCount), height: separatorStrokeWidth, // 默认 2vp }; // ⇒ progressBarSize = width * (N-1) / N // 已完成条(绿):同样的 left/right,但宽度受动画控制 progressBarStyle = { …, width: progressAnim }; // 动画目标 const animateToPosition = (progressBarSize / (stepCount - 1)) * position; Animated.timing(progressAnim, { toValue: animateToPosition, duration: 200, useNativeDriver: false });

⇒绿条宽度 =width · k / N(useNativeDriver: false⇒ JS 驱动)。

3.3 ★ 当前步骤为什么"更大更白"

const getStepStatus = (p) => p === currentPosition ? CURRENT : p < currentPosition ? FINISHED : UNFINISHED; // CURRENT:白底 + 粗绿边 + sizeAnim(动画到 currentStepIndicatorSize=40) // FINISHED:实心 stepIndicatorFinishedColor '#4aae4f',尺寸 stepIndicatorSize=30 // UNFINISHED:stepIndicatorUnFinishedColor '#a4d4a5',尺寸 30 // 且 stepContainer 是 flex:1 ⇒ 每步等分 ⇒ 圆心 x = width/(2N) + k*width/N

默认配色(正是像素判据的依据):

用途颜色
当前步底色#ffffff(白)
已完成步 / 已完成条#4aae4f(绿)
未完成步 / 背景条#a4d4a5(浅绿)

3.4 交互

const stepPressed = (position) => { if (onPress) { onPress(position); } }; // 每个步骤与标签都包在 TouchableWithoutFeedback 里,点击 ⇒ stepPressed(position)

⚠️注意:源码里还有一个onCurrentPositionChanged,但它是组件内部的const函数(src/index.tsx:389),不是 prop(src/types.ts里也没有声明它)⇒它无法从外部监听(见第六节我的失误)。


四、验证设计:两个独立的像素判据

判据内容为什么可靠
① 绿条宽度已完成色带(#4aae4f)的宽度应为W·k/N与"动画跑到哪"直接挂钩
② 当前步圆心白色圆圈(#ffffff,40vp)的圆心 x 应为W/(2N)+k·W/N,且尺寸比其它大位置 + 尺寸双重特征,不易误判

两个判据互相独立(一个看色带长度、一个看圆圈位置),能交叉验证。

测量方式:以布局 dump 的绝对坐标为准(见第七节的教训:截图有 JPEG 色晕,几何量不准)。


五、实测结果

5.1 断言 13 / 13

组内容结果
A 契约默认导出存在、是 memo 对象、typeof object、有$$typeof、无可用prototype、枚举全部具名导出5/5
B 渲染与几何4 个实例渲染未抛错、标题不与状态栏重合、4 个实例尺寸、两个判据的预言值7/7
C 回调事件记录格式1/1
合计13/13

实例尺寸:{"s1":"416x79","s2":"416x79","s3":"416x79","s4":"416x79"}⇒容器宽 416vp = 1248px✓

5.2 ★★ 几何逐像素复核(布局 dump 绝对坐标)

S2(k=2 / N=5):

y=2034..2043 (h=9) x=161..1159 (w=998) ← 背景条(浅绿) y=2034..2043 (h=9) x=161..660 (w=499) ← ★ 已完成条(绿) y=1978..2098 (h=120) x=600..720 (w=120) ← ★ 当前步(k=2)40vp,圆心 660 y=1993..2083 (h=90) x=116..206 / 366..456 / 865..955 / 1114..1204 ← 其余 30vp,圆心 161/411/910/1159

S3(k=4 / N=5):

y=711..720 (h=9) x=161..1159 (w=998) ← ★ 已完成条【满格】 圆心:161 / 411 / 660 / 910 / ★1159(当前步 120px,其余 90px)

S1(k=0):只有背景条(浅绿),没有已完成绿条✓

汇总:

实例绿条宽度 预言实测当前步圆心 预言实测当前步尺寸
S1 (k=0)00(无)✓160.8161✓120px
S2 (k=2)499.2499✓660.0660✓120px
S3 (k=4)998.4998✓1159.21159✓120px

⇒两个判据、三个实例、六组数字全部逐像素吻合✓✓

5.3 ★ 交互实测

S4 是 3 步(stepCount=3)的受控实例,圆心预言为36+1248/6+k·416⇒244 / 660 / 1076;实测:

圆: x=199..289 w=90 圆心 x=244 ✓ 圆: x=615..705 w=90 圆心 x=660 ✓ 圆: x=1016..1136 w=120 圆心 x=1076 ✓(当前步,更大)

点击第 1 个圆(244, 1680)⇒ 日志:

PRESS onPress(0)

⇒onPress触发,且 index 正确(0 基)✓

5.4 UI:标题不与状态栏重合

TITLE measureInWindow y=420 (状态栏高 117) ⇒ 420 > 117,不重合 ✓

六、我自己的一个失误

我把onCurrentPositionChanged当成了回调 prop,在测试页里这样写:

<StepIndicator currentPosition={pos} onPress={...} onCurrentPositionChanged={(p) => logEvent(`POS-CHANGED onCurrentPositionChanged(${p})`)} // ← 无效 />

实测结果:点击只打出PRESS onPress(0),没有任何POS-CHANGED。

读源码后确认:onCurrentPositionChanged是组件内部定义的const函数(src/index.tsx:389,在getStepStatus之后),由内部的useEffect([currentPosition, progressBarSize])调用;它不在 props 解构里,src/types.ts的StepIndicatorProps里也没有它⇒它不是对外 API,外部无法监听。

纠正:把 C 组的设计改为"只断言真实存在的 prop(onPress)",并在文章里写明onCurrentPositionChanged不是 prop。

⚠️教训:回调名不等于回调 prop。看到组件内部有个onXxx(...)调用,就去props解构里核一遍——只有当它出现在解构参数(或propTypes/类型声明)里,才是对外 API。


七、方法上的一个教训:几何量必须用 dump,不能信截图

本轮我先用截图扫色来量进度条,得到的是x=117..1203;而布局 dump给出的绝对坐标是x=161..1159。

差异来自JPEG 压缩的色晕(边缘像素被混色,落到我的颜色容差之外/之内)。dump 的数值是精确的(161 与预言 160.8 只差 0.2px)。

⇒判据分工:

  • 几何(位置/尺寸)⇒ 用布局 dump 的绝对坐标;
  • 颜色/状态/视觉对照 ⇒ 用截图(比如"绿条到哪结束"这种颜色跳变,dump 里没有颜色信息)。

八、已知限制与本次验证边界

8.1 用这个库要知道的

事项说明
prepare: "bob build"仍在目录/file:接入必须加--ignore-scripts(否则会因为找不到bob而安装失败)
main指向编译产物lib/commonjs/index(源码在src/)⇒ 核对改动时要连产物一起比
默认导出是memo对象typeof 'object'、import后拿不到prototype
onCurrentPositionChanged不是 prop它是内部函数,外部无法监听;要感知变化只能靠自己的currentPosition状态
进度条是动画的(200ms)useNativeDriver: false(JS 驱动);截图时机太早可能拍到中间态
当前步比其它步大currentStepIndicatorSize(40) vsstepIndicatorSize(30) ⇒ 布局高度按 40 算

8.2 本次验证的边界

  1. 只验证了direction='horizontal'(默认)⇒direction='vertical'完全未测(源码里竖屏分支用的是height/(2*stepCount)/top/bottom,几何另有公式);
  2. renderLabel/renderStepIndicator两个自定义渲染回调未验证;
  3. customStyles自定义未逐项验证(只用了默认配色);
  4. labels的选中态颜色未做像素核对(源码里currentStepLabelColorvslabelColor不同,但文字颜色不好扫);
  5. 步骤数 ≠ 5 的横向几何只验了stepCount=3(S4);其它数量未穷举;
  6. 进度条动画的中间态未验证(只在动画结束后测量);
  7. stepCount=1的边界未测(源码里progressBarSize/(stepCount-1)会除以 0⇒animateToPosition = Infinity,然后被isNaN兜住 ⇒ 但这只是代码级推断,未实测);
  8. 只在一台模拟器上验证(Pura X View,density 3,1320×2232),没有真机;未做跨平台对照。

未改动库代码。


九、常见问题

Q1:为什么import StepIndicator from 'react-native-step-indicator'拿不到prototype?

因为它导出的是React.memo(StepIndicator)的返回值,是个对象(typeof 'object'),不是 class/函数。要看它的 props 请查src/types.ts的StepIndicatorProps。

Q2:npm install报找不到bob?

因为包里保留了"prepare": "bob build",而bob(react-native-builder-bob)只是 devDependency。目录/file:接入时prepare会执行⇒ 安装失败。

解法:

npminstall../react-native-step-indicator --ignore-scripts

(走.tgz安装不会触发prepare。)

Q3:进度条(已完成色带)的长度是怎么算的?

绿条宽度 = width * currentPosition / stepCount

推导:背景条从left/right = width/(2N)起 ⇒ 自身宽width*(N-1)/N;动画目标是
(progressBarSize/(stepCount-1)) * position⇒ 乘起来正好是width*k/N。
实测(W=1248, N=5):k=2 ⇒499px(算 499.2)、k=4 ⇒998px(算 998.4)✓

Q4:怎么把当前步骤做得更显眼?

默认已经做了两件事:当前步圆更大(currentStepIndicatorSize40 vsstepIndicatorSize30)、底色变白(stepIndicatorCurrentColor: '#ffffff')且带粗绿边(currentStepStrokeWidth: 5)。都能通过customStyles改。

Q5:onCurrentPositionChanged怎么监听?

监听不了—— 它是组件内部的函数,不是 prop(StepIndicatorProps里没有它)。要感知位置变化,请自己持有currentPosition状态:

const [pos, setPos] = useState(0); <StepIndicator currentPosition={pos} onPress={setPos} /> // 位置变化由你自己掌握

Q6:点击步骤能拿到下标吗?

能。onPress(position)给的就是0 基下标(实测点第 1 个圆得到onPress(0))。

Q7:stepCount传 1 会怎样?

按源码推,progressBarSize / (stepCount - 1)会除以 0⇒ 目标值变成Infinity/NaN,而代码里有isNaN(animateToPosition) ? 0 : animateToPosition兜底 ⇒ 进度条宽度会退回 0。⚠️这一条属代码级推断,本轮未实测。

Q8:颜色怎么改?

统一走customStyles:

<StepIndicator customStyles={{ stepIndicatorFinishedColor: '#4aae4f', stepIndicatorUnFinishedColor: '#a4d4a5', stepIndicatorCurrentColor: '#ffffff', separatorFinishedColor: '#4aae4f', separatorUnFinishedColor: '#a4d4a5', currentStepLabelColor: '#4aae4f', }} />

Q9:这个库需要鸿蒙侧做什么特殊处理吗?

不需要。纯 JS、零依赖、import 图干净(只有react/react-native)、不需要 HAR / 权限 /ohpm。唯一要注意的是安装时的prepare和上面几条 API 细节。


小结

react-native-step-indicator是纯 JS 单组件库(源码 475 行),零依赖、无需原生接线。设备侧13 / 13断言通过,一次构建就过。

最值得记下来的是这几条:

  1. ★★ 能从源码推出"确定的像素值"时,就把它当判据。这个库的进度条宽度有闭式公式(W·k/N),当前步的圆心也有(W/(2N)+k·W/N)⇒ 我据此做了两个互相独立的判据,三个实例六组数字全部逐像素吻合(499/998 与 660/1159)。⇒比"看起来对"硬得多,而且一旦公式写错会立刻暴露。

  2. ★ 几何量必须用布局 dump 的绝对坐标,不要信截图。我用截图扫色量出117..1203,而 dump 是161..1159—— 差的正是JPEG 色晕。⇒分工:几何用 dump,颜色/视觉用截图。

  3. ★ 回调名 ≠ 回调 prop。onCurrentPositionChanged名字看着像回调 prop,实际是组件内部的const函数⇒ 我从外部传它完全没有效果。⇒判断一个回调是否对外,要去props解构 /propTypes/ 类型声明里核一遍(这与"引用一个子路径/可选入口前先看它的 import 图"是同一个思路,只是发生在 API 层面)。

  4. prepare是跨库反复出现的坑。这个库保留了上游的"prepare": "bob build"⇒ 目录/file:接入会失败。⇒接库时把scripts扫一遍(prepare/prepublish/postinstall),一律用--ignore-scripts兜底。

  5. main指向编译产物时要连产物一起核。本库main = lib/commonjs/index,所以"逐文件比对"里必须包含lib/**—— 否则"源码没改"不能推出"跑起来的产物没改"。


本篇用到的库

项内容
三方库react-native-step-indicator(上游1.0.3的鸿蒙适配版)
适配仓库https://atomgit.com/oh-react-native/react-native-step-indicator
适配 TAG1.0.3-ohos-1.0.0
需要 HAR / 权限 / ohpm都不需要(纯 JS,零依赖)
库类型纯 JS 单组件库:步骤条 / 进度指示器
运行时依赖零;peerDependencies只有react/react-native
prepare⚠️ 有"prepare": "bob build"⇒目录/file:接入必须--ignore-scripts
许可证MIT
上游仓库https://github.com/24ark/react-native-step-indicator(★1459)
宿主工程RNOH084Demo(测试页rnAppKey = StepIndicatorTestApp)
# 从适配仓库安装npminstall"git+https://atomgit.com/oh-react-native/react-native-step-indicator.git#1.0.3-ohos-1.0.0"--ignore-scripts# 本地目录接入(开发常用)—— prepare: bob build 会让不带 --ignore-scripts 的安装失败npminstall../react-native-step-indicator --ignore-scripts
// metro.config.jswatchFolders:[path.resolve(__dirname,'../react-native-step-indicator')],
import StepIndicator from 'react-native-step-indicator'; const [pos, setPos] = useState(0); const labels = ['已下单', '已付款', '已发货', '运输中', '已签收']; // ① 基本用法(横向,5 步) <StepIndicator currentPosition={pos} stepCount={5} labels={labels} onPress={setPos} // ★ 真 prop:点击步骤/标签会给 0 基下标 /> // ② 自定义配色 <StepIndicator currentPosition={2} stepCount={5} customStyles={{ stepIndicatorFinishedColor: '#4aae4f', stepIndicatorUnFinishedColor: '#a4d4a5', stepIndicatorCurrentColor: '#ffffff', separatorFinishedColor: '#4aae4f', separatorUnFinishedColor: '#a4d4a5', currentStepLabelColor: '#4aae4f', }} /> // ③ 自定义标签渲染 <StepIndicator currentPosition={1} stepCount={3} labels={['A', 'B', 'C']} renderLabel={({position, stepStatus, label, currentPosition}) => ( <Text>{`${position}:${label}(${stepStatus})`}</Text> )} /> // ⚠️ onCurrentPositionChanged 不是 prop(内部函数),传了也没用
# 换页启动测试页(force-stop 不能省,换页参数只在冷启动生效)hdc shell aa force-stop com.rnoh084.demo hdc shell aa start-bcom.rnoh084.demo-aEntryAbility--psrnAppKey StepIndicatorTestApp

几何判据的复现方式

# ★ 几何量用布局 dump 的【绝对坐标】,不要用截图扫色(JPEG 色晕会让边缘偏几十像素)devecocli ui layout|Select-String'MARK-S2'# 期望(W=1248, N=5, k=2):# 背景条 x=161..1159 (w=998) 已完成绿条 x=161..660 (w=499)# 当前步圆 w=120 圆心 x=660 其余圆 w=90 圆心 x=161/411/910/1159

验证环境

项版本
React Native0.84.1
React19.2.3
RNOH(npm / ohpm)@react-native-oh/react-native-harmony/@rnoh/react-native-openharmony0.84.3
Node.js / npmv24.14.0/11.9.0
DevEco Studio26.0.0.621
HarmonyOS SDKAPI 26(26.0.0.32)
设备HarmonyOS 7.0.0(26.0.0) Beta2 模拟器Pura X View(ohos-x64),1320×2232,density 3
本机状态栏高度117px(页面留白取 48vp)
宿主 HAP 产物entry-default-signed.hap
本次构建assembleHap3 分 41 秒(一轮就过,无重编)
验证规模设备侧13 / 13断言;几何复核3 个实例 × 2 个判据 = 6 组(绿条 0/499/998、圆心 161/660/1159、当前步圆 120px);交互 1 次(onPress(0));UI 安全区 1 项

相关社区与项目地址

项目地址
React Native 鸿蒙官方社区(CPF-RN)https://atomgit.com/CPF-RN
RNOH 框架仓库https://atomgit.com/openharmony-RN/ohos_react_native
RNOH 三方库使用文档https://atomgit.com/OpenHarmony-RN/usage-docs
React Native for OpenHarmony 组织https://atomgit.com/oh-react-native
RN 三方库鸿蒙适配清单https://atomgit.com/oh-react-native/rn-ohos-adaptation-overview

欢迎加入 CPF-RN 鸿蒙社区:https://atomgit.com/CPF-RN

React Native for OpenHarmony 组织:https://atomgit.com/oh-react-native

RN 三方库鸿蒙适配清单:https://atomgit.com/oh-react-native/rn-ohos-adaptation-overview

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/27 0:05:09

Ubuntu下Nginx配置与Vue项目部署全指南

1. 项目概述 作为一名长期在Linux环境下工作的开发者&#xff0c;我经常需要在Ubuntu服务器上配置Nginx来部署前端项目。Nginx作为一款高性能的Web服务器和反向代理服务器&#xff0c;因其轻量级、高并发处理能力而广受欢迎。今天我将分享一个完整的Nginx配置流程&#xff0c;从…

作者头像 李华
网站建设 2026/10/19 22:48:40

Vue3日期处理利器Day.js:轻量高效替代Moment.js

1. 为什么前端开发者需要Day.js&#xff1f; 在Vue3项目中处理日期时间&#xff0c;原生JavaScript的Date对象就像一把生锈的瑞士军刀——功能都有但用起来处处别扭。我曾在一个电商项目中&#xff0c;因为时区转换问题加班到凌晨3点&#xff0c;直到发现了Day.js这个仅2KB的日…

作者头像 李华
网站建设 2026/10/21 2:08:23

C#连接MySQL 8.0生产级实战:连接字符串、驱动选型与排错指南

1. 这不是“Hello World”式连接&#xff0c;而是生产级C#与MySQL的实战握手你点开这篇内容&#xff0c;大概率不是为了看一句Console.WriteLine("Connected!")就收工的玩具代码。你可能正被一个实际需求推着走&#xff1a;公司老系统要对接MySQL做数据同步&#xff…

作者头像 李华
网站建设 2026/10/20 19:27:35

GitHub Copilot Canvas:开发者工作流的拓扑建模与认知增强

1. 这不是另一个代码补全工具&#xff1a;Copilot App 与 Canvas 的本质跃迁很多人第一次看到“GitHub Copilot App”和“Canvas”这两个词时&#xff0c;下意识会把它归类为“又一个智能编程助手”。我最初也是这么想的——直到在某跨平台系统开发中&#xff0c;连续三天被一个…

作者头像 李华
网站建设 2026/10/23 6:26:51

基于SpringBoot+Vue的疫苗预约系统设计与实现

1. 项目概述 "疫苗发布和接种预约系统"是一个基于现代Web技术栈构建的医疗信息化解决方案。这个系统采用前后端分离架构&#xff0c;后端使用SpringBoot框架&#xff0c;前端采用Vue.js&#xff0c;数据库选用MySQL&#xff0c;实现了从疫苗信息管理到接种预约的全流…

作者头像 李华
网站建设 2026/10/21 1:59:43

Python+Django构建绘画约稿平台的技术实践

1. 项目概述 hx4196是一个基于Python技术栈开发的绘画约稿接稿平台&#xff0c;旨在连接画师与需求方&#xff0c;提供作品展示、交易撮合、项目管理等一站式服务。这类平台在数字内容创作领域具有广泛需求&#xff0c;尤其适合插画、原画、二次元等垂直领域的创作者生态。 作…

作者头像 李华