HarmonyOS6 半年磨一剑 - RcList 组件核心架构与类型系统设计

HarmonyOS6 半年磨一剑 - RcList 组件核心架构与类型系统设计

文章目录

前言

Hello 各位开发者们大家好, 我是若城,今天我们开始对Rchoui三方库新的组件开始讲解, 本期我们主要讲解的是 RcList 这个组件, 话不多说我们先看下效果图吧~~~

开源计划

项目预计于 2026 年 7 月中旬正式开源,届时可通过三方库直接下载使用。在此期间,我会通过系列文章逐一介绍每个模块的设计思路与实现细节。

rchoui 官网

目前暂定 rchoui 官网地址:http://rchoui.ruocheng.site/

需要注意的是,当前官网还在完善当中,会在后续更新中逐步完善,届时可以为大家提供更加完善的说明文档。

一、组件整体架构

1.1 双组件协作模式

RcList 体系采用容器 + 子项的双组件协作模式:

  • RcList:列表容器,负责滚动控制、边框、间距、背景色、滚动事件派发
  • RcListItem:列表子项,负责单行内容渲染,包含图标、标题、描述、角标、开关、箭头

两者通过 @BuilderParam 插槽机制连接,组合使用时代码结构清晰:

import{ RcList, RcListItem }from'rchoui'RcList(){RcListItem({ rcListItemTitle:'第一项'})RcListItem({ rcListItemTitle:'第二项'})}

这种设计让容器与子项职责分离,容器只管"怎么滚",子项只管"怎么显示",彼此不耦合。

1.2 文件结构

rchoui/src/main/ets/dataComponents/RcList/ ├── index.ets # 组件实现(RcList + RcListItem) ├── index.type.ets # 类型定义(Props、Config 接口) └── README.md # API 文档 

组件将类型定义实现代码完全分离,遵循单一职责原则。类型文件 index.type.ets 可独立引用,方便二次封装。

1.3 依赖关系图

关于RcIcon 在我们之前的章节中已经有所讲解了, 至于该三方库的源码 是否公开,目前还没有想好, 因此这里仅展示了一些设计原则,依赖关系等, 方便开发者在使用时能够更加清晰的理解,为什么这样用,或者 为什么这个ui组件可以通过某种方式来展示等。。

RcList / RcListItem | +-- RcIcon (额外图标渲染) | +-- RcSwitch (开关组件) | +-- RcUIBaseStyle (全局基础样式) | +-- RcGlobalConfig (全局配置) | +-- getSizeByUnit (尺寸工具函数) 
提示:RcIconRcSwitch 是 rchoui 内置的基础组件,RcList 通过组合而非继承的方式复用它们。

二、类型系统设计

2.1 核心类型总览

index.type.ets 中定义了完整的类型体系,分为联合类型接口两大类:

类型名类型形式用途
RcListDirection联合类型列表/子项排列方向
RcListItemThumbSize联合类型缩略图预设尺寸
RcListItemLinkType联合类型页面跳转方式
RcListItemValue联合类型通用值类型
RcListBadgeConfig接口角标配置
RcListExtraIconConfig接口额外图标配置
RcListItemData接口列表数据模型
RcListItemProps接口RcListItem Props
RcListProps接口RcList Props

2.2 方向类型设计

// RcListDirection:支持水平和垂直两种排列exporttypeRcListDirection='row'|'column'

RcListDirection 同时被 RcList(容器方向)和 RcListItem(子项内部排列)使用,复用同一类型约束,避免冗余。

2.3 缩略图尺寸类型

// 预设三档尺寸,也支持直接传数值exporttypeRcListItemThumbSize='small'|'medium'|'large'// 在组件 @Param 中的声明:@Param rcListItemThumbSize: RcListItemThumbSize | RcStringNumber ='medium'

通过 RcListItemThumbSize | RcStringNumber 联合类型,开发者既可使用语义化字符串('small''medium''large'),也可以直接传入自定义数值(如 50),兼顾便捷性和灵活性

三档预设对应像素值:

预设值像素尺寸
'small'40 × 40
'medium'60 × 60
'large'80 × 80
自定义数值N × N

2.4 角标配置接口

exportinterfaceRcListBadgeConfig{// 角标内容,支持数字和字符串 value?:string|number// 角标背景色,默认红色 '#fa3534' color?: ResourceColor // 是否显示点状角标(优先级高于 value) isDot?:boolean// 最大值,超过后显示为 '99+',默认 99 max?:number}

RcListBadgeConfig 的设计充分考虑了真实业务场景

  • 数字角标(未读消息数)
  • 超出最大值自动截断(99+
  • 点状角标(仅提示有新内容,不显示数量)
  • 文字角标(如 'NEW''HOT'

2.5 额外图标配置接口

exportinterfaceRcListExtraIconConfig{// 支持 RcIcon 图标名,也支持本地/网络图片 name:keyof RcIconDataType | ResourceStr color?: ResourceColor size?: RcStringNumber // 默认 20}

name 字段使用 keyof RcIconDataType | ResourceStr 联合类型,使得:

  • 传入 'icon-houi_bell_outline' 等字符串时,使用内置矢量图标
  • 传入 $r('app.media.xxx') 或 URL 时,使用图片资源

这是类型引导开发的典型体现,IDE 可以为 keyof RcIconDataType 提供自动补全。

2.6 列表数据模型

exportinterfaceRcListItemData{ id?:string|number title?:string note?:string thumb?: ResourceStr rightText?:string badge?: RcListBadgeConfig extraIcon?: RcListExtraIconConfig disabled?:boolean customData?: Record<string, ESObject>// 自定义扩展数据}

RcListItemData 是为数据驱动渲染预留的数据模型,customData 字段允许携带任意业务数据,具有良好的可扩展性。


三、RcList 容器核心实现

3.1 关键 @Param 属性

@ComponentV2export struct RcList {// 是否显示外层边框@Param rcListBorder:boolean=false// 列表高度(为 0 且 rcListScrollable 为 true 时不启用滚动)@Param rcListHeight: RcStringNumber =0// 是否启用滚动(需要配合 rcListHeight 使用)@Param rcListScrollable:boolean=true// 滚动条状态@Param rcListScrollBarState: BarState = BarState.Auto // 边缘弹性效果@Param rcListEdgeEffect: EdgeEffect = EdgeEffect.Spring // 外部注入的滚动控制器@Param rcListScroller: Scroller =newScroller()// 内容插槽@BuilderParamrcListContentBuilder:()=>void=this.rcListDefaultContent }
提示:rcListHeightrcListScrollable 需要同时满足才会渲染可滚动容器。这是一种防误用的设计——避免开发者忘记设置高度导致滚动失效。

3.2 滚动事件三元组

RcList 对外暴露三个滚动相关事件:

// 实时滚动偏移量(每帧触发)@EventonRcListScroll:(scrollOffset:number, scrollState: ScrollState)=>void=()=>{}// 滚动到底部(加载更多的触发点)@EventonRcListScrollToLower:()=>void=()=>{}// 滚动到顶部(下拉刷新的触发点)@EventonRcListScrollToUpper:()=>void=()=>{}

内部通过 handleRcListScrollhandleRcListScrollEdge 两个方法处理 ArkUI Scroll 组件的原生事件,并转化为更语义化的上层事件。

3.3 @BuilderParam 插槽机制

// 内容插槽声明@BuilderParamrcListContentBuilder:()=>void=this.rcListDefaultContent // 默认空实现@BuilderrcListDefaultContent(){}

使用方通过尾随闭包语法填充列表内容:

RcList({ rcListBorder:true}){// 这里的内容会被注入到 rcListContentBuilder 中RcListItem({ rcListItemTitle:'设置项 A'})RcListItem({ rcListItemTitle:'设置项 B'})}

这是 ArkUI @BuilderParam 的标准用法,等效于 Web 开发中的 slot 插槽机制。


四、RcListItem 结构划分

4.1 四区布局模型

每个 RcListItem 的水平布局分为四个区域:

|---额外图标区---|---缩略图区---|---主体内容区(flex:1)---|---右侧操作区---| 

对应四个 @Builder 方法:

@BuilderrenderRcListItemExtraIcon()// 左侧图标(extraIcon)@BuilderrenderRcListItemThumb()// 左侧缩略图(thumb + badge)@BuilderrenderRcListItemBody()// 中间标题 + 描述@BuilderrenderRcListItemFooter()// 右侧文字/开关/箭头

主体内容区使用 .layoutWeight(1) 占据剩余空间,左右两侧区域按内容自适应宽度。

4.2 主体内容区渲染

@BuilderrenderRcListItemBody(){Column({ space:4}){if(this.rcListItemTitle){Text(this.rcListItemTitle).fontSize(15)// 禁用时文字变灰.fontColor(this.rcListItemDisabled ?'#c0c4cc':'#303133').fontWeight(FontWeight.Medium)}if(this.rcListItemNote){Text(this.rcListItemNote).fontSize(13).fontColor('#909399')// 限制行数与省略号:rcListItemEllipsis 为 1-5 时生效.maxLines(this.rcListItemEllipsis >0&&this.rcListItemEllipsis <=5?this.rcListItemEllipsis :undefined).textOverflow(this.rcListItemEllipsis >0?{ overflow: TextOverflow.Ellipsis }:undefined)}}.alignItems(HorizontalAlign.Start).layoutWeight(1)}

描述文本的 maxLinestextOverflow 联动控制,rcListItemEllipsis 取值范围限定在 1-5,超出范围则不限制行数,这是一种防御性参数校验

4.3 右侧操作区互斥逻辑

@BuilderrenderRcListItemFooter(){Row({ space:8}){// 右侧文字(可与开关/箭头共存)if(this.rcListItemRightText){Text(this.rcListItemRightText).fontSize(14).fontColor('#909399')}if(this.rcListItemShowSwitch){// 优先显示开关RcSwitch({...})}elseif(this.rcListItemShowArrow &&!this.rcListItemShowSwitch){// 没有开关时才显示箭头RcIcon({ name:'icon-houi_chevron_right_outline', iconSize:16, color:'#c0c4cc'})}}}

开关与箭头互斥是业务逻辑的体现:有开关的项目不需要箭头引导跳转。条件判断层次清晰,避免了两者同时显示的 UI 冲突。

总结

RcListRcListItem 构成的双组件体系,是 HarmonyOS6 ArkUI 场景下列表开发的高效解法。其核心设计理念包括:类型驱动开发(完整的 TypeScript 类型约束)、职责分离(容器与子项解耦)、全局主题集成(AppStorageV2 响应式配置)以及渲染分支策略(滚动与静态的智能切换)。

掌握了本篇的架构原理,你已经对整个组件体系有了扎实的底层认知,后续深入缩略图、角标、交互、实战等专题时将会更加游刃有余。

如果这篇文章对你有帮助,欢迎点赞、收藏、关注,你的支持是我持续创作的动力!

Read more

【论文阅读】Self-supervised Learning of Person-specific Facial Dynamics for APR

【论文阅读】Self-supervised Learning of Person-specific Facial Dynamics for APR

基于特定人物面部动态的自监督学习自动人格识别 * 摘要 * 引言INTRODUCTION * 相关工作 * 五因素模型 * 人格、面部行为与情绪之间的关系 * 基于视频的自动人格预测 * 方法 * 面部动态的自监督学习 * 人格化描述提取 * 训练人格模型 * 实验 * 人格数据库 * 实现细节 * 评价指标 * 消融实验 * 与其他方法的比较 * 结论 论文 关键词:自动人格分析(APR),排序损失,面部时间演变,人格化动态层,自监督学习,卷积神经网络,CNN权重表示 本文主要创新点在于:自监督学习、关注个性化特征 摘要 本文旨在解决现有自动人格分析系统中频繁出现的两个重要问题:1. 使用短视频片段甚至单帧,而非长期行为来推断人格特质;2. 缺乏对特定个体面部动态进行编码以用于人格识别的方法。为解决这些问题,本文提出了一种新颖的排序损失(Rank Loss)利用面部动作的自然时间演变,而非人格标签,来进行面部动态的自监督学习。我们首先训练一个通用的U-net风格模型从一组未标记的面部视频中学

By Ne0inhk
开源杀疯了!Qwen3.5 Plus + OpenClaw,性能对标GPT-5.2还免费商用

开源杀疯了!Qwen3.5 Plus + OpenClaw,性能对标GPT-5.2还免费商用

文章目录 * 一、先唠明白:Qwen3.5 Plus到底是什么来头 * 二、OpenClaw:给大模型装个「万能插件底座」 * 三、实测对比:凭什么说对标GPT-5.2? * 四、零门槛上手:5行代码调用Qwen3.5 Plus * 五、OpenClaw集成:让大模型更听话、更能打 * 六、本地部署方案:离线也能用,隐私拉满 * 七、商用无忧:开源授权+免费额度全解析 * 八、常见问题踩坑指南 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.ZEEKLOG.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,

By Ne0inhk
DeepSeek V4正式发布!与Gemini 3.1 Pro深度评测:中国开源力量与美国闭源巅峰的正面交锋

DeepSeek V4正式发布!与Gemini 3.1 Pro深度评测:中国开源力量与美国闭源巅峰的正面交锋

2026年3月第一周,中国AI圈期待已久的DeepSeek V4正式发布,与此前两周谷歌推出的Gemini 3.1 Pro形成正面交锋。这不仅是两款旗舰模型的同期竞技,更是中国开源力量与美国闭源巅峰的技术路线对决:DeepSeek V4以“原生多模态+国产芯片深度适配+极致成本控制”杀入战场,而Gemini 3.1 Pro则以“ARC-AGI-2 77.1%推理断层领先+三层思考模式+幻觉抗性跃升”巩固护城河。本文从基准测试、核心架构、多模态能力、成本策略四大维度进行深度技术拆解,为开发者和AI爱好者提供硬核参考。 国内用户可通过聚合镜像平台RskAi(ai.rsk.cn)直接体验Gemini 3.1 Pro,同时等待DeepSeek V4的镜像接入,形成双模型布局——一个应对深度复杂推理,一个满足高性价比国产需求。 一、发布动态:时间线与战略意图 关键信号:DeepSeek V4打破了AI行业长期惯例—

By Ne0inhk
用OpenClaw做飞书ai办公机器人(含本地ollama模型接入+自动安装skills+数据可视化)

用OpenClaw做飞书ai办公机器人(含本地ollama模型接入+自动安装skills+数据可视化)

执行git clone https://github.com/openclaw/openclaw克隆项目,执行cd openclaw进入项目 执行node --version看看node的版本是否大于等于22(没有node.js需自行安装),再执行npm install -g pnpm安装作为包管理器,并执行pnpm install安装依赖 首次执行pnpm ui:build构建 Web UI(会先安装 ui/ 目录的依赖) 执行pnpm build构建主程序 执行pnpm openclaw onboard --install-daemon运行配置向导(安装守护进程),完成初始化 按键盘右箭头选择Yes,同样Yes 任选一个模型提供商都行,没有对应的提供商的密钥可以跳过,如果是本地模型选vLLM(需用vLLM框架启动模型,有性能优势,但原生vLLM仅完全支持Linux的cuda)、Custom Provider(可以连接任何 OpenAI 或 Anthropic 兼容的端点,

By Ne0inhk