尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
HarmonyOS 6.0 样式复用与@Styles/@Builder
写ArkUI代码最烦的就是重复——卡片样式、按钮样式、列表项模板复制粘贴一多维护就崩。HarmonyOS NEXT给了三种复用机制Styles管属性、Builder管组件、Extend管扩展各有各的适用场景和限制。Styles — 属性级复用Styles把一组通用属性抽取出来当成一个属性方法调用StylesfancyCard():void{.width(100%).padding(16).borderRadius(12).backgroundColor(#ffffff).shadow({radius:4,color:#1a000000,offsetY:2}).margin({bottom:12})}// 使用Column(){Text(内容)}.fancyCard()核心限制只能用通用属性— .padding、.borderRadius、.backgroundColor、.width、.margin、.shadow这些属于CommonAttribute的属性可以用。组件特有属性如Text的.fontSize、.fontColor不能出现在Styles里。返回void不能链式调用— .fancyCard()返回void后面不能再接.width()或.margin()。所有需要的属性都要写在Styles定义内部。可以定义在struct内或全局— struct内定义的Styles只能在该组件使用全局定义的可以被所有组件共享。支持无参和带参数— 带参数版本可以实现动态样式StylescardWithRadius(radius:number):void{.borderRadius(radius).padding(16).backgroundColor(#ffffff)}// 使用Column(){...}.cardWithRadius(8)Column(){...}.cardWithRadius(16)常见错误// 错误1: 在Styles里用组件特有属性StylestitleText():void{.fontSize(16)// Text特有属性不属于CommonAttribute.fontWeight(FontWeight.Bold)}// 错误2: 在Styles后链式调用Column(){...}.fancyCard().width(100%)// 编译报错Property width does not exist on type void// 正确: width写在Styles内部StylesfancyCard():void{.width(100%).padding(16).borderRadius(12).backgroundColor(#ffffff)}Builder — 组件级复用Builder能封装完整的UI片段包含子组件和布局这是Styles做不到的BuilderInfoRow(label:string,value:string):void{Row(){Text(label).fontSize(13).fontColor(#888888).width(80)Text(value).fontSize(13).fontColor(#333333).layoutWeight(1)}.width(100%).padding({top:6,bottom:6})}// 使用Column(){this.InfoRow(名称,HarmonyOS)this.InfoRow(版本,API 12)this.InfoRow(语言,ArkTS)}按值传递 vs 按引用传递Builder的参数传递有两种方式行为不同按值传递基本类型参数值在调用时拷贝后续修改不影响已渲染的UIBuilderPresetButton(preset:StylePreset,index:number):void{Button(preset.name).backgroundColor(this.currentPresetindex?#1a73e8:#cccccc)}this.PresetButton(this.presets[0],0)按引用传递对象参数加:前缀传递引用UI能响应对象变化BuilderItemBuilder(item:Item):void{// item是引用变化时会更新Text(item.name)}this.ItemBuilder({name:test})// 传对象字面量注意按引用传递的对象必须是class/interface类型不能用基本类型。全局Builder vs 成员Builder成员Builder— 定义在struct内用this.builderName()调用可以访问组件的State变量全局Builder— 定义在struct外用builderName()调用不能访问组件状态成员Builder能直接用this访问状态这是最大的优势Componentstruct MyPage{StateisActive:booleanfalse;BuilderStatusBadge():void{Row(){Text(this.isActive?激活:未激活)// 直接用this.fontColor(this.isActive?#43a047:#e53935)}}}Extend — 扩展原生组件Extend给原生组件添加自定义属性方法Extend(Text)functiontitleText(size:number):void{.fontSize(size).fontWeight(FontWeight.Bold).fontColor(#333333)}// 使用Text(标题).titleText(20)Text(副标题).titleText(16)核心限制只能在全局作用域定义— 不能写在struct内部这是跟Styles/Builder最大的区别只能扩展指定组件—Extend(Text)只能给Text组件添加方法不能给Column用只支持属性方法— 跟Styles类似只能加属性链不能加子组件支持参数— 可以传参实现动态样式// 按钮变体Extend(Button)functionprimaryButton():void{.backgroundColor(#1a73e8).fontColor(#ffffff).borderRadius(8).fontSize(14)}Extend(Button)functiondangerButton():void{.backgroundColor(#e53935).fontColor(#ffffff).borderRadius(8).fontSize(14)}Button(确认).primaryButton()Button(删除).dangerButton()三种机制对比特性StylesBuilderExtend定义位置struct内或全局struct内或全局仅全局包含子组件不可以可以不可以支持参数支持支持支持适用范围所有组件所有组件指定组件返回值voidvoidvoid调用方式.styleName()this.builderName().extendName()属性链式定义内部链式自由定义内部链式实际选型指南卡片样式统一→ StylesStylescardStyle():void{.width(100%).padding(16).borderRadius(12).backgroundColor(#ffffff).shadow({radius:4,color:#1a000000,offsetY:2})}列表项模板→ BuilderBuilderListItemTemplate(title:string,desc:string,tag:string):void{Row(){Text(title).fontSize(14).layoutWeight(1)Text(tag).fontSize(10).fontColor(#1a73e8)}.width(100%).padding(12).borderRadius(8).backgroundColor(#ffffff)}按钮风格变体→ ExtendExtend(Button)functionbtnPrimary():void{.backgroundColor(#1a73e8).fontColor(#ffffff).borderRadius(6)}组合使用实际项目中三种机制经常组合使用StylescardBase():void{.width(100%).padding(16).borderRadius(12).backgroundColor(#ffffff)}BuilderInfoCard(title:string,items:string[]):void{Column(){Text(title).fontSize(16).fontWeight(FontWeight.Bold).fontColor(#333333)ForEach(items,(item:string){this.InfoRow(item.substring(0,item.indexOf(:)),item.substring(item.indexOf(:)1))},(item:string,index:number)index.toString())}.cardBase()// Styles Builder组合}Builder里调用Styles完全没问题——Styles是属性方法Builder是组件方法它们在不同层级工作。踩坑清单问题原因解决Styles里用.fontSize报错fontSize不是CommonAttribute改用BuilderStyles后链式.width报错Styles返回void把属性移入Styles定义Extend写在struct内报错Extend只能全局定义移到struct外面Builder里ForEach不刷新key函数返回值重复确保key唯一全局Builder访问不到this全局没有组件上下文改用成员BuilderStyles参数不生效参数类型不支持检查参数类型样式复用的核心原则能用Styles解决的不用Builder能用Builder解决的不用Extend。Styles最轻量Builder最灵活Extend最精确。三者各有领地别跨着用——用Builder做属性复用是大材小用用Styles做组件模板是做不到。
RELATED

相关推荐

GAMES101: Lecture 7: Shading 1(Illumination, Shading and Graphics Pipeline) ppt笔记

GAMES101: Lecture 7: Shading 1(Illumination, Shading and Graphics Pipeline) ppt笔记

Z-Buffer 深度缓存z-buffer指每个采样(像素)储存z值最小的值,即离镜头最近的值,并用两个缓存维护遮挡信息: frame buffer 储存颜色值 & depth buffer(z-buffer) 储存深度 深度缓存发生在像素上 重要! 我…

📅 2026/9/13 2:43:49
2026年国内外最新10款AI写小说软件(持续更新!)

2026年国内外最新10款AI写小说软件(持续更新!)

今天给大家盘点一下26年国内外最新、最实用的10款ai写小说工具。 作为写了几年网文的过来人,深知卡文、想不出人名、大纲崩盘有多痛苦。市面上测试了不下几十款工具,今天挑出10款真正能帮上忙的写小说软件。觉得有启发的小伙伴还请点赞收藏支持&#xf…

📅 2026/8/23 17:17:20
宝可梦传说 Z-A | 全DLC+内置金手指 双端免装中文懒人包

宝可梦传说 Z-A | 全DLC+内置金手指 双端免装中文懒人包

想搓 ZA 但一想到"配 Ryujinx 固件密钥EDEN 驱动金手指 JS 文件"一套下来头大?这次的 ZA PC/安卓双端中文免装整合就是给懒人准备的——全 DLC(《超次元爆涌》胡帕异次元密阿雷超古代御三家超雷丘 XY 双超)齐 ,内置金手…

📅 2026/9/8 15:34:39
MORE NEWS

更多资讯

📰

Java超市管理系统:Servlet+DAO+MySQL构建进销存与事务实战

简介:基于Eclipse与MySQL开发的Java超市管理系统,面向Java学习者、毕业设计者及零售信息化入门人员,覆盖商品进销存、销售管理、采购跟踪、数据统计与管理员/收银员双角色权限控制等核心业务,可帮助读者理解企业级JavaWeb项目的基…

📰

运营人本地AI工作流:Codex+Obsidian手动部署实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

基于BERT的图书多分类实战:从数据清洗到微调全流程

简介:基于BERT的Python图书多分类课程设计项目,以预训练语言模型为核心,面向需要完成NLP课程设计、期末大作业或入门文本分类的开发者。压缩包共16个文件,含9个Python源码、2个pyc编译缓存、1个README说明及4个Git相关文件&#x…

📰

Spring Boot + UniApp智能笔记实战:全栈开发与小程序多端部署

简介:这是一套基于SpringBoot与Vue、Uniapp技术栈的智能笔记应用前后端分离项目,适合正在学习Java后端、小程序或Vue前端开发的初学者,也可用于毕业设计、课程设计、工程实训或初期项目二次开发。压缩包共681个文件,约11.76MB&…

📰

Flutter+鸿蒙开发跨平台井字棋游戏实战

1. 项目概述:鸿蒙Flutter跨平台井字棋游戏井字棋作为经典的策略游戏,是学习游戏开发的绝佳起点。本文将带你使用Flutter框架开发一款兼容鸿蒙系统的跨平台井字棋游戏,实现"一次开发,多端运行"的目标。这个项目特别适合想…

📰

从vibe coding失控到可控:9个开源App打造反焦虑工作流

最近我朋友圈里聊最多的一个词就是 vibe coding。代码交给 AI 写,人负责描述需求、复制报错、然后再祈祷一次能过。听起来很爽,但真上手的人都知道,爽不过三天:项目越写越大,AI 开始“失忆”,同一个 bug 修…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬