Imported from ximing/harmonyos-skills (
skills/harmonyos-arkui/SKILL.md). Install upstream withnpx skills add ximing/harmonyos-skills --skill harmonyos-arkui. Copyright stays with the author.
鸿蒙 ArkUI 声明式 UI
何时使用本 skill
- 用 ArkTS 声明式范式写页面和自定义组件:
@Component拆分、@Builder/@BuilderParam复用、@Styles/@Extend抽样式 - 状态管理选型拿不准:
@State/@Prop/@Link/@Provide/@Consume/@ObjectLink,或 V2 的@Local/@Param/@Event/@ObservedV2/@Trace该用哪个 - 长列表/网格/瀑布流卡顿,要上
LazyForEach、cachedCount、@Reusable组件复用 - 页面导航:Navigation 路由栈、分栏自适应、转场动效(新项目不要再用 @ohos.router)
- 动画与手势:属性动画、共享元素转场(一镜到底)、gesture/priorityGesture/parallelGesture 与手势冲突
- 多端适配:断点、栅格(GridRow/GridCol)、媒体查询、折叠屏/平板分栏、深浅色主题、UI Design Kit 精品样式
核心方法论
ArkUI 的核心心智模型一句话:UI 是状态的函数。build() 描述 UI 长什么样,状态变量驱动它刷新——所以 ArkUI 开发的绝大多数问题(不刷新、卡顿、数据不同步)都出在状态管理和渲染控制上。以下七节按真实开发顺序组织。
① 声明式语法与自定义组件
页面即组件:@Entry 标记入口、@Component 声明组件、build() 返回 UI 描述。复杂页面按"拆小组件 → 抽复用"演进:
@Builder:组件内的自定义构建函数,抽重复 UI 片段;全局复用配合wrapBuilder。@BuilderParam:组件的"插槽",让调用方传入 UI 内容(类似 Vue slot)。@Styles:复用通用属性(width/height 等);@Extend:封装某个具体组件的样式+事件组合。- 生命周期:组件级
aboutToAppear/onDidBuild/aboutToDisappear;页面级(@Entry)另有onPageShow/onPageHide/onBackPress。详见 自定义组件生命周期。
@Component
struct TitleBar {
title: string = '';
@BuilderParam actions: () => void; // 调用方注入右侧操作区
build() {
Row() {
Text(this.title).fontSize(18).fontWeight(FontWeight.Bold)
Blank()
this.actions()
}
.width('100%').padding(12)
}
}
② 状态管理选型(最高频问题,先看这里)
先记住两条铁律,再查表选型:
- 只有被装饰器装饰的变量才是状态变量,且只有"框架能观察到的修改"才触发刷新——
@State观察一层赋值,嵌套属性(this.a.b.c = x)观察不到。 - 状态管理仅支持 UI 主线程,Worker/TaskPool 里不能用。
| 场景 | V1(存量项目) | V2(新应用推荐) |
|---|---|---|
| 组件内部状态 | @State |
@Local |
| 父 → 子单向(子可本地改) | @Prop(深拷贝) |
@Param + @Once |
| 父子双向 | @Link |
@Param + @Event(!! 语法糖) |
| 跨层级双向(爷孙) | @Provide / @Consume |
@Provider / @Consumer |
| 嵌套 class 对象属性级观测 | @Observed + @ObjectLink / @Track |
@ObservedV2 + @Trace |
| 变更监听回调 | @Watch |
@Monitor |
| 计算属性 | 无(getter 模拟) | @Computed |
| 应用全局 / 页面级 / 持久化 | AppStorage / LocalStorage / PersistentStorage | AppStorageV2 / LocalStorage / PersistenceV2 |
官方建议:新开发的应用直接用 V2;存量 V1 项目满足需求不必急着迁。每个装饰器的代码示例、数据流方向图与迁移要点见 references/state-management.md;权威说明读 状态管理概述。
③ 渲染控制与列表性能
- 条件渲染
if/else;循环渲染按数据量选:ForEach(小数据量、非滚动容器)→LazyForEach(长列表懒加载)→Repeat(可复用循环渲染,V2 场景替代方案)。 LazyForEach只在 List/ListItemGroup/Grid/Swiper/WaterFlow 中生效(这些容器可配cachedCount缓存屏外项);其他容器会一次性全量创建。- LazyForEach 三条硬规则:数据源实现
IDataSource接口;键值生成器对每项生成唯一且稳定的键值;数据变更通过DataChangeListener通知——整体重赋值dataSource会异常,直接改数组不会触发刷新。 - 滚动场景叠加
@Reusable(V1)/@ReusableV2(V2)组件复用,划出屏幕的节点进缓存池、复用代替重建。 - 布局层面:减少嵌套层级、优先扁平容器,嵌套过深直接拖慢布局测量。
List({ space: 8 }) {
LazyForEach(this.dataSource, (item: Message) => {
ListItem() {
MessageRow({ msg: item }) // MessageRow 用 @Reusable 装饰可进复用池
}
}, (item: Message) => item.id) // 键值唯一稳定,别用 index
}
.cachedCount(5)
性能调优的完整流程(Profiler 抓 trace → 定位 → 优化)见 UI高性能开发。
④ 页面导航:用 Navigation,别再用 router
- Navigation + NavPathStack(API 10 起推荐):Navigation 作为 @Entry 页面的根容器,子页面是 NavDestination,路由栈(NavPathStack)负责 push/pop/replace 与传参;自带转场动效与标题栏联动。
- 多端红利:
mode(NavigationMode.Auto)默认自适应——窗口宽度 ≥600vp 自动切分栏(左列表右详情),一次开发天然适配折叠屏/平板。 @ohos.router已不推荐,仅存量维护;迁移按 Router切换Navigation。
// 主页持有路由栈,跳转传参
this.pageStack.pushPath({ name: 'Detail', param: { id: 42 } });
// Detail 页(NavDestination)构建时通过 ready 回调的 NavDestinationContext 取 param
⑤ 动画与手势
动画按场景选型:
| 场景 | 接口 |
|---|---|
| 状态变化附带过渡 | 属性动画:.animation() 绑定 / animateTo() 显式闭包 |
| 组件出现/消失 | 转场动画:.transition()(配合 if 渲染) |
| 跨页面元素延续 | 共享元素转场(一镜到底,geometryTransition) |
| 逐帧驱动 | 帧动画(@ohos.animator) |
| 节奏感 | 动画曲线:传统曲线(线性/ease/贝塞尔)、弹簧曲线 |
手势三件套:gesture(常规,父子竞争)、priorityGesture(优先响应,解决子组件抢手势)、parallelGesture(并行响应,父子都收到)。Tap/LongPress/Pan/Pinch/Rotation/Swipe 可组合成组合手势;滚动容器内手势冲突见 手势冲突处理。注意:这三个绑定方法不支持用三目运算符切换手势。
⑥ 布局与多端适配
容器选型:Row/Column(线性,配 justifyContent/alignItems)、Stack(层叠)、Flex(弹性换行)、RelativeContainer(复杂相对关系)、GridRow/GridCol(栅格)、Tabs(页签)、List/Grid/WaterFlow(滚动容器)。选型对照见 references/arkui-cheatsheet.md。
多端适配三板斧:
- 断点:栅格默认断点 xs
[0,320)/ sm[320,600)/ md[600,840)/ lg[840,+∞)(vp),可扩展 xl/xxl;不同断点给不同栅格 span 与布局结构。 - 媒体查询:
@ohos.mediaquery监听屏幕宽度/横竖屏/深浅色变化,驱动布局切换。 - 系统级自适应:Navigation 的 Auto 分栏、智慧多窗声明与避让、沉浸式效果。
"一次开发,多端部署"官方文档已迁移到在线最佳实践(体验设计 → 页面开发 → 功能开发端到端指导),本地留存 路径调整说明;本地可落地的实操篇目是 栅格布局 (GridRow/GridCol) 与 媒体查询 (@ohos.mediaquery)。
⑦ 主题、弹窗与 UI Design Kit
- 主题:深浅色适配(资源走
resources/dark目录或WithTheme)、应用内换肤;图标优先用 SymbolGlyph/SymbolSpan(矢量符号,支持分层动效)。 - 弹窗体系按场景选:即时反馈 Toast;固定样式弹窗 AlertDialog;自定义弹窗 CustomDialog 或不依赖 UI 组件的全局
openCustomDialog;气泡 Popup/openPopup;菜单 Menu/openMenu;半模态bindSheet、全模态bindContentCover;浮层 OverlayManager。全景见 弹窗概述。 - UI Design Kit:符合 HarmonyOS Design 规范的扩展样式套件——侧边栏、底部页签(模糊/出血/分割线)、核心操作栏、列表卡片、流光/点光源/按压阴影等视效。要做"精致感"界面先看 UI Design Kit简介,比手写样式快得多。
常见坑
- 改了嵌套属性界面不刷新 ❌
this.user.address.city = 'x'(@State 只观测一层赋值) ✅ 嵌套对象用@Observed+@ObjectLink(V1)或@ObservedV2+@Trace(V2);简单场景整体替换对象。定位套路见 状态变量改变不触发组件刷新问题常用定位方法。 - @Prop 传大对象/深层数据 ❌ @Prop 初始化时深拷贝,嵌套超 5 层会因深拷贝与 GC 引发性能问题,且 PixelMap、RegExp 等类型深拷贝后丢失原类型 ✅ 深层嵌套数据改用
@ObjectLink,或 V2 的@Param(不做深拷贝)。 - 长列表用 ForEach 全量渲染 ❌ 几千条数据一次性建组件,首帧卡、内存爆 ✅ 换 LazyForEach +
cachedCount+@Reusable;键值必须唯一稳定(别直接用 index),数据更新走DataChangeListener,整体重赋值 dataSource 会直接异常。 - 新页面还在用 @ohos.router ❌ router 官方已标记不推荐 ✅ 新页面上 Navigation + NavPathStack,顺手套餐分栏自适应与转场动效。
- 拿 PersistentStorage 当数据库 ❌ 持久化大对象、高频变化的变量(持久化是慢操作) ✅ 它只适合持久化少量 UI 状态(如设置项开关);结构化数据、大对象请走 harmonyos-network-data 的首选项/关系型数据库。
- 在 Worker/TaskPool 里读写状态变量 ❌ 状态管理仅支持 UI 主线程 ✅ 子线程算完把结果 postMessage 回 UI 线程再改状态(并发选型见 harmonyos-ability)。
决策树:我要做 XX 该去哪
| 我要做… | 去哪 |
|---|---|
| 状态管理装饰器逐个对比 + 代码示例 | references/state-management.md |
| 常用组件/属性一行速查 | references/arkui-cheatsheet.md |
| Ability 生命周期、Want 跳转传参、卡片、并发 | harmonyos-ability |
| 网络请求、首选项/数据库/跨设备数据 | harmonyos-network-data |
| Canvas 自绘、图片/音视频、相机 | harmonyos-media |
| 掉帧卡顿定位、Profiler 使用 | harmonyos-testing + UI高性能开发 |
| 页面跳转、路由栈、单双栏自适应 | 组件导航(Navigation) (推荐) |
| 长列表/网格/瀑布流搭建 | 列表与网格概述、LazyForEach:数据懒加载 |
| 动画、转场、一镜到底 | 动画概述 |
| 手势绑定与冲突、统一拖拽 | 绑定手势方法、支持统一拖拽 |
| 弹窗/半模态/气泡/菜单 | 弹窗概述 |
| 深浅色、换肤、图标符号 | 应用深浅色适配 |
| 平板/折叠屏/多窗适配 | 应用声明支持智慧多窗、栅格布局 (GridRow/GridCol) |
| 精品样式:侧边栏/页签栏/光影视效 | UI Design Kit简介 |
| 界面显示异常、白屏闪烁排查 | UI显示异常调试 |
| 帧率/时延/内存等体验是否达标 | 应用UX体验建议 |
参考速查
- references/state-management.md — 状态管理 V1/V2 装饰器决策表:每种的数据流方向、代码示例、选型与迁移要点
- references/arkui-cheatsheet.md — 常用组件速查:容器/基础/表单/导航/媒体/弹窗,一行一个含关键属性
下方路由区列出本 skill 认领的全部 399 篇文档(由脚本生成,请勿手改)。
本区由
scripts/gen-routes.py生成,请勿手改。本 skill 认领文档共 399 篇。
应用框架/ArkUI(方舟UI框架)(319 篇)
- ArkUI术语
- ArkUI简介
- UI国际化
- UI开发(ArkTS声明式开发范式)概述
- 使用UI上下文接口操作界面(UIContext)
- 使用组件截图(ComponentSnapshot)
- 媒体查询 (@ohos.mediaquery)
- 全屏启动元服务组件(FullScreenLaunchComponent)
- 同应用进程嵌入式组件 (EmbeddedComponent)
- 感知组件可见性
- 检查页面布局
- 应用深浅色适配
- 设置应用内主题换肤
- 模糊
- 色彩
- 阴影
- 传统曲线
- 动画曲线概述
- 弹簧曲线
- 动画概述
- 动画衔接
- 实现属性动画
- 属性动画概述
- 自定义属性动画
- 帧动画(ohos.animator)
- 粒子动画
- 组件动画
- 共享元素转场 (一镜到底)
- 出现/消失转场
- 旋转屏动画
- 模态转场
- 转场动画概述
- 页面转场动画 (不推荐)
- 即时反馈(Toast)
- 不依赖UI组件的全局自定义弹出框 (openCustomDialog)
- 固定样式弹出框
- 基础自定义弹出框 (CustomDialog)
- 弹出框层级管理
- 弹出框控制器
- 弹出框概述
- 弹出框焦点策略
- 弹出框蒙层控制
- 页面级弹出框
- 弹窗概述
- 不依赖UI组件的全局气泡提示 (openPopup)
- 气泡提示概述
- 气泡提示(Popup)
- 绑定全模态页面(bindContentCover)
- 绑定半模态页面(bindSheet)
- 绑定模态页面概述
- 不依赖UI组件的全局菜单 (openMenu)
- 菜单控制(Menu)
- 菜单概述
- 设置浮层(OverlayManager)
- 图文混排
- 图标小符号 (SymbolGlyph/SymbolSpan)
- 富文本编辑(RichEditor)
- 属性字符串(StyledString/MutableStyledString)
- 文本显示 (Text/Span)
- 文本概述
- 文本输入 (TextInput/TextArea/Search)
- 管理软键盘
- 内容修改器 (ContentModifier)
- 属性修改器 (AttributeModifier)
- 属性更新器 (AttributeUpdater)
- 自定义扩展能力概述
- 自定义组合
- 使用画布绘制自定义图形 (Canvas)
- 自定义绘制修改器 (DrawModifier)
- 自定义能力概述
- 自定义占位节点
- 自定义声明式节点 (BuilderNode)
- 自定义渲染节点 (RenderNode)
- 自定义组件节点 (FrameNode)
- 自定义节点概述
- 设置自定义节点跨语言属性
- 几何图形绘制概述
- 形状裁剪(clipShape)
- 绘制几何图形 (Shape)
- 列表与网格概述
- 创建列表 (List)
- 创建瀑布流(WaterFlow)
- 创建网格 (Grid/GridItem)
- 弧形列表 (ArcList)(圆形屏幕推荐使用)
- 创建弧形轮播 (ArcSwiper)(圆形屏幕推荐使用)
- 创建轮播 (Swiper)
- 显示图片 (Image)
- 视频播放 (Video)
- @Require装饰器:校验构造传参
- UI装饰器总览
- 基本语法概述
- 声明式UI描述
- @AnimatableExtend装饰器:定义可动画属性
- @BuilderParam装饰器:引用@Builder函数
- @Builder装饰器:自定义构建函数
- @Extend装饰器:定义扩展组件样式
- @LocalBuilder装饰器: 维持组件关系
- @Styles装饰器:定义组件重用样式
- mutableBuilder:实现全局@Builder动态更新
- stateStyles:多态样式
- wrapBuilder:封装全局@Builder
- 组件扩展概述
- 创建自定义组件
- 自定义组件冻结功能(V1)
- 自定义组件冻结功能(V2)
- @ReusableV2装饰器:V2组件复用
- @Reusable装饰器:V1组件复用
- 自定义组件成员属性访问限定符使用限制
- 自定义组件生命周期
- 自定义组件的自定义布局
- ContentSlot:混合开发
- ForEach:循环渲染
- LazyForEach迁移Repeat指南
- LazyForEach:数据懒加载
- Repeat:可复用的循环渲染
- if/else:条件渲染
- 渲染控制概述
- MVVM模式(V1)
- MVVM模式(V2)
- V1-V2迁移概述
- AnimateTo使用迁移
- 内置对象的迁移
- 应用内状态变量迁移
- 循环渲染迁移
- 数据对象状态变量迁移
- 组件内状态变量迁移
- 组件复用迁移
- 状态管理V1和V2混用指导(API version 19前)
- 状态管理V1和V2混用指导(API version 19及之后)
- 状态管理V1和V2更新机制差异
- 状态管理原理介绍
- 应用内状态管理和其他常见问题
- 数据对象状态管理常见问题
- 状态变量改变不触发组件刷新问题常用定位方法
- 组件内状态管理常见问题
- 状态管理术语
- 状态管理概述
- AppStorage:应用全局的UI状态存储
- Environment:设备环境查询
- LocalStorage:页面级UI状态存储
- PersistentStorage:持久化存储UI状态
- 管理应用拥有的状态概述
- @Track装饰器:class对象属性级更新
- @Link装饰器:父子双向同步
- @Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化
- @Prop装饰器:父子单向同步
- @Provide装饰器和@Consume装饰器:与后代组件双向同步
- @State装饰器:组件内状态
- @Watch装饰器:状态变量更改通知
- AppStorageV2: 应用全局UI状态存储
- PersistenceV2: 持久化存储UI状态
- @Computed装饰器:计算属性
- @Monitor装饰器:状态变量修改监听
- @ObservedV2装饰器和@Trace装饰器:类属性变化观测
- @Type装饰器:标记类属性的类型
- @Event装饰器:规范组件输出
- @Local装饰器:组件内部状态
- @Once:初始化同步一次
- @Param:组件外部输入
- @Provider装饰器和@Consumer装饰器:跨组件层级双向同步
- !!语法:双向绑定
- $$语法:系统组件双向同步
- addMonitor/clearMonitor接口:动态添加/取消监听
- applySync/flushUpdates/flushUIUpdates接口:同步刷新
- getTarget接口:获取状态管理框架代理前的原始对象
- makeObserved接口:将非观察数据变为可观察数据
- @Env:环境变量
- 支持无障碍
- 支持适老化
- 交互响应概述
- 交互基础机制说明
- 支持焦点处理
- 支持统一拖拽
- 单一手势
- 多层级手势事件
- 手势冲突处理
- 组合手势
- 绑定手势方法
- 支持表冠输入事件
- 支持触屏输入事件
- 支持触控板输入事件
- 支持键盘输入事件
- 支持鼠标输入事件
- 自定义渲染 (XComponent)
- 进度条 (Progress)
- 布局概述
- 开发应用沉浸式效果
- 层叠布局 (Stack)
- 弹性布局 (Flex)
- 栅格布局 (GridRow/GridCol)
- 相对布局 (RelativeContainer)
- 线性布局 (Row/Column)
- 选项卡 (Tabs)
- 切换按钮 (Toggle)
- 单选框 (Radio)
- 弧形按钮 (ArcButton)
- 按钮 (Button)
- 表单与选择组件概述
- Router切换Navigation
- 组件导航(Navigation) (推荐)
- 组件导航和页面路由概述
- 页面路由 (@ohos.router)(不推荐)
- UI开发 (兼容JS的类Web开发范式)概述
- 使用WebGL绘制图形
- background-position样式动画
- svg动画
- transform样式动画
- 属性样式动画
- 动画动效
- 动画帧
- 组件动画
- CanvasRenderingContext2D对象
- Canvas对象
- OffscreenCanvasRenderingContext2D对象
- Path2D对象
- 基础知识
- 绘制图形
- 绘制文本
- 绘制路径
- button开发指导
- chart开发指导
- image-animator开发指导
- image开发指导
- input开发指导
- marquee开发指导
- menu开发指导
- picker开发指导
- qrcode开发指导
- rating开发指导
- search开发指导
- slider开发指导
- switch开发指导
- text开发指导
- toolbar开发指导
- dialog开发指导
- form开发指导
- list开发指导
- stepper开发指导
- swiper开发指导
- tabs开发指导
- 栅格布局
- 动画
- 手势事件
- 布局说明
- 添加图片区域
- 添加容器
- 添加标题行和文本区域
- 添加留言区域
- 添加交互
- 组件介绍
- 页面路由
- app.js
- js标签配置
- 多语言支持
- 文件组织
- 生命周期
- CSS语法参考
- HML语法参考
- JS语法参考
- 资源限定与访问
- 自定义组件
- NDK支持多线程创建组件
- 使用动画
- Text组件的文本绘制与显示
- 监听输入框事件
- 在NDK中保证多实例场景功能正常
- 基于NDK构建UI概述
- 嵌入ArkTS组件
- 接入ArkTS页面
- 使用列表
- 使用瀑布流
- 构建弹窗
- 构建渲染节点
- 构建自定义组件
- 查询和操作自定义节点
- 拖拽事件
- 监听组件事件
- 监听组件布局和绘制送显事件
- 绑定手势事件
- 自定义绘制
- 通过EmbeddedComponent拉起EmbeddedUIExtensionAbility
- 通过XComponent接入无障碍
- UI上下文异常调试
- 使用文本常见问题
- 按钮与选择组件常见问题
- 自定义节点常见问题
- UI显示异常调试
- UI相关应用崩溃常见问题
- UI相关应用无响应常见问题
- UI稳定性故障分析概述
- UI调优
- UI预览
- UI高性能开发
- 使用Display实现屏幕属性查询及状态监听 (ArkTS)
- 使用OH_DisplayManager实现屏幕基础信息查询和状态监听 (C/C++)
- 屏幕开发常见问题
- 屏幕管理开发术语
- 屏幕管理简介
- 使用WindowManager管理多模输入事件(C/C++)
- 全局闪控球开发指导
- 使用NDK接口实现画中画功能开发(C/C++)
- 使用XComponent实现画中画功能开发(ArkTS)
- 使用typeNode实现画中画功能开发(ArkTS)
- 画中画常见问题
- 画中画开发概述
- 启动页资源分类配置
- 应用启动页简介
- 配置应用启动页
- 应用声明支持智慧多窗
- 应用布局适配智慧多窗
- 顶部窗口控制条避让适配智慧多窗
- 智慧多窗简介
- 窗口元数据配置
- 窗口开发常见问题
- 窗口开发术语
- 窗口开发概述
- 窗口旋转
- 管理应用窗口(FA模型)
- 管理应用窗口(Stage模型)
应用框架/UI Design Kit(UI设计套件)(32 篇)
- 怎么获取layeredDrawableDescriptor对象信息?
- UI Design Kit简介
- 设置embed模式的侧边栏
- 设置overlay模式的侧边栏
- 侧边栏菜单样式
- 设置列表卡片样式
- 设置附带横滑的列表样式
- 设置定时通知弹窗
- 设置常驻通知弹窗
- 应用内多窗
- 资源注册
- 单层图标处理
- (推荐)分层图标处理
- 设置侧边栏半屏居中对齐样式
- 设置页签栏的分割线
- 设置页签栏的模糊样式
- 设置页签的图标出血样式
- 设置无主按钮的组件
- 设置有主按钮的组件
- 半模态样式
- 图标类型设置
- 开发实例
- 标题栏动态显隐
- 设置信息提醒
- 设置动态模糊样式
- 设置应用内多窗
- 设置自定义区域
- 双边边缘流光
- 按压阴影
- 点光源效果
- 背景流光
- 自带背景的双边流光