在鸿蒙(HarmonyOS)的ArkUI框架中,除了常见的 @Component@Entry@State 装饰器外,还有许多其他装饰器,它们用于不同的场景和功能。以下是主要的装饰器及其含义:


1. 组件相关装饰器

  • @Component
    标记一个结构为自定义组件,组件必须用此装饰器修饰才能参与页面布局和渲染。

  • @Entry
    标记当前组件为页面的入口组件(即页面的根组件),一个页面必须有且仅有一个 @Entry 组件。


2. 状态管理装饰器

  • @State
    声明组件的内部状态变量,状态变化会自动触发UI更新。

    @State count: number = 0;
    
  • @Prop
    声明从父组件传递的单向绑定变量,子组件不能直接修改它,只能通过父组件更新。

    @Prop message: string;
    
  • @Link
    声明与父组件的双向绑定变量,子组件的修改会同步到父组件。

    @Link isSelected: boolean;
    
  • @Provide@Consume
    实现跨组件层级的数据共享(祖先组件提供数据,后代组件消费数据)。

    // 祖先组件
    @Provide("theme") theme: string = "light";
    
    // 后代组件
    @Consume("theme") theme: string;
    
  • @Observed@ObjectLink
    用于观察对象内部属性的变化(通常配合类使用)。

    @Observed
    class User {
      name: string;
    }
    
    @Component
    struct Child {
      @ObjectLink user: User; // 绑定对象的属性变化
    }
    
  • @Watch
    监听状态变量的变化,触发回调函数。

    @State @Watch("onCountChange") count: number = 0;
    onCountChange() { ... }
    

3. UI 布局与样式装饰器

  • @Builder
    定义可复用的UI片段(类似函数式组件)。

    @Builder MyButton() { Button("Click") }
    
  • @Styles
    定义可复用的样式集合(类似于CSS的类)。

    @Styles commonStyle() {
      .width(100).height(50)
    }
    
  • @Extend
    扩展原生组件的样式,支持动态逻辑。

    @Extend(Text) function boldText() {
      .fontWeight(FontWeight.Bold)
    }
    

4. 生命周期装饰器

  • @AboutToAppear
    组件即将显示时触发的回调(类似 onReady)。

    @AboutToAppear
    onAboutToAppear() { ... }
    
  • @AboutToDisappear
    组件即将销毁时触发的回调(类似 onDestroy)。

    @AboutToDisappear
    onAboutToDisappear() { ... }
    

5. 其他装饰器

  • @StorageLink@StorageProp
    与应用持久化存储(AppStorage)双向或单向绑定。

    @StorageLink("username") username: string; // 双向绑定
    @StorageProp("language") language: string; // 单向绑定
    
  • @LocalStorageLink@LocalStorageProp
    与页面级存储(LocalStorage)绑定,作用域小于 AppStorage


关键区别总结

装饰器 作用范围 数据流向 典型用途
@State 组件内部 内部可变 组件私有状态
@Prop 父→子 单向 父组件传递不可变数据
@Link 父↔子 双向 父子组件同步数据
@Provide/@Consume 跨层级 单向/双向 祖先-后代数据共享
@StorageLink 全局存储 双向 持久化数据同步

示例代码片段

@Component
struct ParentComponent {
  @State parentCount: number = 0;

  build() {
    Column() {
      // 单向传递
      ChildComponent({ childProp: this.parentCount })
      // 双向绑定
      ChildComponent({ childLink: $parentCount })
    }
  }
}

@Component
struct ChildComponent {
  @Prop childProp: number; // 单向
  @Link childLink: number; // 双向

  build() {
    Button(`Click ${this.childProp}`)
      .onClick(() => {
        this.childLink++; // 双向绑定可修改父组件状态
      })
  }
}

这些装饰器是鸿蒙ArkUI开发的核心,合理使用可以高效管理状态、组件通信和UI渲染。建议结合官方文档和实际场景练习。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐