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

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

文章目录

前言

各位开发者,大家好!我是若城。

在鸿蒙应用开发过程中,我发现许多组件样式和工具方法具有高度的复用性,但每次新项目都需要重复编写,这极大地降低了开发效率。因此,我决定投入半年时间,打造一款专为鸿蒙生态设计的 UI 组件库 —— rchoui

项目简介

rchoui 是一个面向 HarmonyOS6 的企业级 UI 组件库,旨在提供开箱即用的高质量组件,让开发者告别"重复造轮子"。

rchoui官网

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

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

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

一、概述

RcText是一个功能强大的文本展示组件,采用ComponentV2装饰器实现,支持多种主题样式、尺寸规格、特殊显示模式以及灵活的样式定制。本文将深入解析RcText组件的核心架构设计、类型系统以及设计思想。

二、组件架构设计

2.1 装饰器体系

RcText组件采用HarmonyOS6最新的@ComponentV2装饰器,这是ArkUI框架的新一代组件定义方式:

@ComponentV2export struct RcText {// 组件实现}

核心优势:

  • 提供更优秀的性能表现
  • 支持更精细的状态管理
  • 具备更强的类型推断能力
  • 优化渲染效率和响应速度

2.2 参数状态管理

组件使用@Param装饰器定义所有可配置属性,实现清晰的参数管理:

核心内容参数
@Param text:string|number=''@Param type: RcTextType ='default'@Param textSize: RcTextSize ='default'

这三个参数构成文本组件的核心:

  • text: 支持字符串和数字类型,满足各种显示需求
  • type: 定义文本的主题语义
  • textSize: 控制文本尺寸规格
样式定制参数
@Param color:string| Resource =''@Param fontSize: RcStringNumber =0@Param fontWeight: RcTextWeight ='normal'@Param textAlign: RcTextAlign ='left'@Param textDecoration: RcTextDecoration ='none'@Param lineHeight: RcStringNumber =0

设计亮点:

  • 所有样式参数都提供合理默认值
  • 自定义参数优先级高于预设配置
  • 参数命名清晰,语义明确
  • 支持渐进式定制,基础用法简单,高级用法灵活
高级功能参数
@Param maxLines:number=0@Param truncated:boolean=false@Param mode: RcTextMode ='text'@Param href:string=''@Param selectable:boolean=false

这些参数提供了文本组件的高级能力:

  • maxLines: 多行文本截断控制
  • truncated: 单行截断快捷开关
  • mode: 特殊显示模式(价格、手机号、链接)
  • selectable: 文本可选中复制功能

2.3 类型系统设计

RcText组件建立了完善的类型定义体系,确保类型安全和开发体验。

文本主题类型
exporttypeRcTextType='default'|'primary'|'success'|'warning'|'danger'|'info'

设计思路:

  • 涵盖6种常见的UI语义类型
  • 每种类型对应特定的视觉风格
  • 与设计规范中的色彩体系一致

颜色映射关系:

类型颜色值使用场景
default#303133常规文本内容
primary#409eff强调信息、链接
success#67c23a成功提示、正向状态
warning#e6a23c警告信息、注意事项
danger#f56c6c错误提示、危险操作
info#909399次要信息、辅助说明
尺寸规格类型
exporttypeRcTextSize='large'|'default'|'small'

尺寸预设规范:

尺寸字体大小使用场景
large18vp标题文字、重要信息
default14vp正文内容、常规显示
small12vp辅助文字、次要信息

设计考量:

  • 提供3档常用尺寸,覆盖90%使用场景
  • 采用vp单位,适配不同屏幕密度
  • 保持字号阶梯合理,视觉层级清晰
对齐方式类型
exporttypeRcTextAlign='left'|'center'|'right'|'start'|'end'

类型说明:

  • left/center/right: 传统的左中右对齐
  • start/end: 支持国际化的开始/结束对齐
  • 在RTL(从右到左)语言环境下,start/end会自动适配
文本装饰类型
exporttypeRcTextDecoration='none'|'underline'|'line-through'

装饰效果:

  • none: 无装饰,默认状态
  • underline: 下划线,常用于链接
  • line-through: 删除线,表示作废或优惠前价格
字体粗细类型
exporttypeRcTextWeight='normal'|'bold'|'lighter'|'bolder'|number

灵活设计:

  • 提供4种预设字重关键字
  • 支持数值类型(100-900),满足精确控制需求
  • 兼顾易用性和灵活性
显示模式类型
exporttypeRcTextMode='text'|'price'|'phone'|'link'

这是RcText的创新设计,内置了常见的业务场景:

模式详解:

  1. text模式(默认)
    • 普通文本显示
    • 不做任何格式化处理
  1. price模式
    • 自动添加货币符号(¥)
    • 保留两位小数
    • 添加千分位分隔符
    • 示例: 1234.56¥1,234.56
  2. phone模式
    • 手机号脱敏显示
    • 中间4位替换为星号
    • 示例: 13888888888138****8888
  3. link模式
    • 链接文本模式
    • 配合href参数使用
    • 支持点击跳转逻辑

三、核心设计模式

3.1 策略模式 - 主题颜色管理

组件采用策略模式管理不同主题的颜色配置:

privategetTypeColor():string| Resource {if(this.color){returnthis.color }switch(this.type){case'primary':return'#409eff'case'success':return'#67c23a'case'warning':return'#e6a23c'case'danger':return'#f56c6c'case'info':return'#909399'case'default':default:return'#303133'}}

设计亮点:

  1. 优先级机制: 自定义color优先级最高,提供完全覆盖能力
  2. 默认兜底: default分支确保任何情况都有颜色返回
  3. 类型安全: 返回类型支持Resource,兼容系统资源引用
  4. 集中管理: 所有颜色配置集中在一处,便于维护和主题扩展

3.2 计算属性模式 - 尺寸计算

使用私有方法实现计算属性,处理尺寸的优先级逻辑:

privategetSizeValue():string{if(this.fontSize){returngetSizeByUnit(this.fontSize)}switch(this.textSize){case'large':return'18vp'case'small':return'12vp'case'default':default:return'14vp'}}

优先级规则:

  1. 自定义fontSize: 最高优先级,提供像素级精确控制
  2. 预设textSize: 次级优先级,提供快捷配置
  3. 默认值: 兜底逻辑,确保组件始终可用

工具函数集成:

  • getSizeByUnit函数统一处理数值单位
  • 支持数字、字符串、带单位字符串等多种输入
  • 自动补充单位,保证输出格式统一

3.3 适配器模式 - 对齐方式转换

将自定义的对齐类型转换为系统TextAlign枚举:

privategetTextAlign(): TextAlign {switch(this.textAlign){case'left':return TextAlign.Start case'center':return TextAlign.Center case'right':return TextAlign.End case'start':return TextAlign.Start case'end':return TextAlign.End default:return TextAlign.Start }}

设计意图:

  • 隔离系统API,组件对外提供更语义化的类型
  • 便于未来扩展,不受系统API变更影响
  • 提供默认值保护,增强健壮性

3.4 装饰器模式 - 文本装饰转换

转换文本装饰类型为系统枚举:

privategetDecoration(): TextDecorationType {switch(this.textDecoration){case'underline':return TextDecorationType.Underline case'line-through':return TextDecorationType.LineThrough case'none':default:return TextDecorationType.None }}

配合使用示例:

.decoration({ type:this.getDecoration(), color:this.getTypeColor()})

装饰线颜色自动跟随文本颜色,保持视觉一致性。

3.5 模板方法模式 - 文本格式化

getFormattedText方法定义了文本格式化的算法骨架:

privategetFormattedText():string{const textValue =String(this.text)switch(this.mode){case'price':const num =parseFloat(textValue)if(isNaN(num))return textValue return'¥'+ num.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g,',')case'phone':if(textValue.length ===11){return textValue.replace(/(\d{3})\d{4}(\d{4})/,'$1****$2')}return textValue case'link':return textValue case'text':default:return textValue }}

实现细节:

    • toFixed(2): 保留两位小数
    • 正则表达式: 每3位数字前添加逗号
    • \B: 非单词边界,避免开头添加逗号
    • (?=(\d{3})+(?!\d)): 正向预查,匹配3的倍数位置
    • 使用正则分组捕获前3位和后4位
    • 中间4位替换为星号
    • 仅处理11位手机号,其他长度保持原样
  1. 容错处理
    • 价格格式化失败时返回原文本
    • 手机号长度不符时返回原文本
    • 确保在任何输入下不会崩溃

手机号脱敏算法

textValue.replace(/(\d{3})\d{4}(\d{4})/,'$1****$2')

价格格式化算法

num.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g,',')

四、组件布局架构

4.1 Row布局结构

RcText使用Row布局实现横向排列:

build(){Row(){// 前置元素// 文本内容// 后置元素}.margin(this.rcMargin).padding(this.rcPadding).onClick(()=>this.handleClick())}

布局优势:

  • 自然的水平流式布局
  • 支持前后元素扩展
  • 响应点击事件
  • 统一的外边距和内边距控制

4.2 条件渲染

组件支持可选的前后置元素:

// 前置部分if(this.prefixIcon){RcIcon({ name:this.prefixIcon, iconSize:this.iconSize, color:this.iconColor ||this.getTypeColor()}).margin({ right:4})}// 文本部分(核心)Text(this.getFormattedText()).fontSize(this.getSizeValue()).fontColor(this.getTypeColor())// ...更多样式配置// 后置部分if(this.suffixIcon){RcIcon({ name:this.suffixIcon, iconSize:this.iconSize, color:this.iconColor ||this.getTypeColor()}).margin({ left:4})}

设计考量:

  • 条件渲染避免空节点
  • 间距自动适配(有文本时才添加间距)
  • 颜色自动联动(未设置时跟随文本颜色)

4.3 文本属性配置

核心Text组件的属性配置体现了组件的灵活性:

Text(this.getFormattedText()).fontSize(this.getSizeValue()).fontColor(this.getTypeColor()).fontWeight(this.getFontWeight()).textAlign(this.getTextAlign()).decoration({ type:this.getDecoration(), color:this.getTypeColor()}).lineHeight(this.lineHeight ?getSizeByUnit(this.lineHeight):undefined).maxLines(this.maxLines >0?this.maxLines :(this.truncated ?1:undefined)).textOverflow(this.maxLines >0||this.truncated ?{ overflow: TextOverflow.Ellipsis }:undefined).copyOption(this.selectable ? CopyOptions.InApp : CopyOptions.None).layoutWeight(1)

属性解析:

  1. 基础样式: 字号、颜色、字重、对齐、装饰
  2. 行高控制: 可选配置,未设置时使用默认行高
  3. 截断逻辑:
    • maxLines优先级更高
    • truncated快捷设置单行截断
    • 同时控制textOverflow为省略号
  4. 选中功能: 通过copyOption控制是否可选中复制
  5. 弹性布局: layoutWeight(1)使文本占据剩余空间

五、交互处理机制

5.1 点击事件处理

组件提供了统一的点击事件处理机制:

privatehandleClick(){if(this.mode ==='link'&&this.href){console.log('Open link:',this.href)}if(this.onTextClick){this.onTextClick()}}

处理流程:

  1. 检查是否为链接模式
  2. 链接模式下处理跳转逻辑(预留扩展点)
  3. 执行用户自定义的点击回调

扩展性设计:

  • 链接跳转逻辑可后续扩展为真实的页面跳转
  • 回调函数可选,不影响基础功能
  • 支持链式处理,先处理内部逻辑再执行回调

5.2 事件冒泡

Row容器的onClick绑定确保整个组件区域可点击:

Row(){// 内容}.onClick(()=>this.handleClick())

这种设计使得不仅文本可点击,整个组件区域都可以响应点击。

六、设计原则体现

6.1 单一职责原则

每个私有方法都有明确的单一职责:

  • getTypeColor(): 专注于颜色获取
  • getSizeValue(): 专注于尺寸计算
  • getFormattedText(): 专注于文本格式化
  • getTextAlign(): 专注于对齐方式转换

6.2 开闭原则

组件对扩展开放,对修改封闭:

  • 通过添加新的type值扩展主题色
  • 通过添加新的mode扩展格式化方式
  • 通过自定义属性覆盖默认行为
  • 无需修改核心代码

6.3 里氏替换原则

Text组件可以被RcText无缝替换:

  • 兼容基础Text的所有功能
  • 提供更丰富的扩展能力
  • 保持API的一致性和可预测性

6.4 接口隔离原则

组件的Props接口定义清晰:

  • 每个属性都有明确的用途
  • 没有冗余或强制不需要的属性
  • 使用可选类型提供灵活性

6.5 依赖倒置原则

组件依赖抽象而非具体实现:

  • 依赖自定义类型而非系统枚举
  • 通过适配器模式转换类型
  • 便于测试和扩展

七、类型安全保障

7.1 泛型工具类型

组件使用了RcStringNumber工具类型:

exporttypeRcStringNumber=string|number

这个类型在rchoui组件库中广泛使用,统一处理尺寸参数的多种输入格式。

7.2 联合类型

大量使用联合类型提供类型约束:

@Param type: RcTextType ='default'@Param textSize: RcTextSize ='default'

优势:

  • IDE自动补全
  • 编译期类型检查
  • 减少运行时错误
  • 提升开发体验

7.3 可选类型

使用可选类型提供灵活性:

@Param color:string| Resource =''

空字符串作为默认值,未设置时使用type对应的颜色。

八、总结

RcText组件通过精心的架构设计实现了:6种主题、3种尺寸、多种对齐和装饰方式,支持预设配置和自定义样式的完美结合,预留扩展点,支持主题定制和功能增强,遵循设计原则,易于理解和维护。
组件的成功在于找到了"简单易用"和"功能强大"之间的平衡点,既满足快速开发需求,又提供深度定制能力。 希望Rchoui可以帮助到各位开发者

Read more

【强化学习】双延迟深度确定性策略梯度算法(TD3)详解

【强化学习】双延迟深度确定性策略梯度算法(TD3)详解

📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏:        【强化学习】- 【单智能体强化学习】(11)---《双延迟深度确定性策略梯度算法(TD3)详解》 双延迟深度确定性策略梯度算法(TD3)详解 目录 一、TD3算法的背景 二、TD3的背景 1.TD3的理论背景 2.DDPG的局限性 三、TD3算法的核心思想 1.双Critic网络(Twin Critics) 2.延迟更新(Delayed Policy Updates) 3.目标策略平滑(Target Policy Smoothing) 四、TD3算法详细讲解 1.

By Ne0inhk
详解【限流算法】:令牌桶、漏桶、计算器算法及Java实现

详解【限流算法】:令牌桶、漏桶、计算器算法及Java实现

令牌桶算法 令牌桶(Token Bucket)算法以一个设定的速率产生令牌(Token)并放入令牌桶,每次用户请求都得申请令牌,如果令牌不足,则拒绝请求。 令牌的数量也是有上限的。令牌的数量与时间和发放速率强相关,时间流逝的时间越长,会不断往桶里加入越多的令牌,如果令牌发放的速度比申请速度快,令牌桶会放满令牌,直到令牌占满整个令牌桶。 * 想象一个固定容量的 “令牌桶”,系统按固定速率向桶中添加令牌(比如每秒放 10 个)。 * 当有请求到达时,需要从桶中获取一个令牌才能被处理;如果桶中没有令牌,请求则被丢弃或排队。 * 令牌桶的容量决定了允许的最大突发流量(比如桶容量 100,意味着最多允许 100 个请求同时突发)。 关键概念: * 令牌生成速率(r):每秒生成的令牌数量(控制长期平均速率)。 * 令牌桶容量(b):桶最多能存放的令牌数(控制最大突发流量)。 * 令牌消耗:每个请求消耗 1 个令牌(可调整为按请求大小消耗)。 特点: * 平滑流量:通过固定速率生成令牌,

By Ne0inhk
Python实现基于SO-CNN-LSTM-Multihead-Attention蛇群算法(SO)优化卷积长短期记忆神经网络融合多头注意力机制进行多变量时间序列预测的详细项目实例(含完整的程序,GUI

Python实现基于SO-CNN-LSTM-Multihead-Attention蛇群算法(SO)优化卷积长短期记忆神经网络融合多头注意力机制进行多变量时间序列预测的详细项目实例(含完整的程序,GUI

目录 Python实现基于SO-CNN-LSTM-Multihead-Attention蛇群算法(SO)优化卷积长短期记忆神经网络融合多头注意力机制进行多变量时间序列预测的详细项目实例... 4 项目背景介绍... 4 项目标与意义... 5 推动高效能多变量时序预测模型的发展... 5 实现参数全局最优,增强模型鲁棒性... 5 多层次特征融合推动信息深度挖掘... 6 降低人工干预与经验依赖,提升智能预测水平... 6 服务多样化领域,实现跨行业几何性提升... 6 项目挑战及解决方案... 6 复杂多变量特征交互的提取难题及融合创新... 6 高维非线性和长依赖性捕捉的建模难题及深度优化... 7 参数全局寻优的高效性挑战及智能优化应对... 7 兼容高噪声与异构性数据的鲁棒性提升... 7 需求驱动与可扩展性的系统性应答... 7 端到端集成与自动调优策略创新... 7 兼容现实应用需求的落地可行性处理... 8 项目模型架构... 8 卷积神经网络(CNN)特征提取模块... 8 长短期记忆网络(LSTM)时序建模模块... 8 多头注

By Ne0inhk