鸿蒙开发手册HARMONYOS

CHAPTER 03声明式 UI · DECLARATIVE

ArkUI
声明式

用声明"界面应该是什么样"取代命令式改界面。状态驱动 UI,组件树是状态的函数。本章覆盖组件、状态、布局与动画。

开始阅读难度进阶约3小时
03.1

声明式心智模型

ArkUI 用声明式范式:你描述"状态到 UI 的映射",框架在状态变化时高效更新界面,无需手动改控件。

@Entry 与 @Component

@Entry 标记页面入口组件,@Component 标记自定义组件,build() 返回组件描述。

03.2

组件与 build

用内置组件(Text/Button/Column/Row)组合出界面,build 中声明结构。

@Entry @Component
struct Index {
  build() {
    Column() {
      Text("欢迎").fontSize(24)
      Button("确认").onClick(() => {})
    }.padding(16)
  }
}
03.3

状态装饰器

@State 触发自身组件刷新;@Prop/@Link 用于父子同步;@Observed/@ObjectLink 观察嵌套对象。

装饰器作用域同步方式
@State组件私有自身刷新
@Prop父→子单向
@Link父↔子双向
@Provide/@Consume跨层级双向
03.4

布局

Column(纵向)、Row(横向)、Flex、Stack(堆叠)、Grid 与 RelativeContainer 表达各种布局。

Row({ space: 12 }) {
  Text("A"); Text("B")
}.justifyContent(FlexAlign.Center)
03.5

列表

ForEach + List 渲染可滚动列表,key 需稳定以保证高效更新。

List() {
  ForEach(this.items, (it) => {
    ListItem() { Text(it.name) }
  }, (it) => it.id)
}
03.6

事件

onClick/onChange/手势等事件直接挂在组件上,回调中更新状态。

TextInput({ placeholder: "请输入" })
  .onChange((v) => this.text = v)
03.7

动画与转场

用 animateTo 或属性动画让状态变化带过渡,组件增删用转场。

animateTo({ duration: 300 }, () => { this.expanded = !this.expanded })
03.8

常见陷阱

为什么 ForEach 列表错乱?

多因 key 不唯一或用了索引。务必提供稳定唯一 key,否则框架无法正确复用 ListItem。

@State 嵌套对象内部改了不刷新?

@State 观察的是引用,改内部属性不触发。用 @Observed + @ObjectLink,或整体替换对象引用。

03.9

实战练习

延伸资源