鸿蒙 @Event装饰器:函数传递

本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、核心概述

@Event是ArkUI状态管理V2中用于规范组件输出的特殊装饰器,专门处理子组件向父组件传递事件和数据的场景。它与@Param装饰器配合使用,实现数据的双向同步和组件间的规范通信。

核心特性:

  • 输出规范化:明确标识组件对外输出的方法
  • 回调机制:通过回调函数实现父子组件通信
  • 双向同步支持:与@Param配合实现数据双向流动
  • 类型安全:支持 TypeScript 类型约束

二、装饰器说明

2.1 基本属性

属性说明
装饰器参数
允许装饰的变量类型回调方法:()=>void(param: Type)=>ReturnType 等
允许传入的函数类型箭头函数、方法引用
使用条件必须用在 @ComponentV2 装饰的自定义组件中

2.2 版本支持

  • 从API version 12开始支持
  • 支持在元服务中使用
  • 需要配合 @ComponentV2 使用

三、工作原理

3.1 与@Param的协同机制

@Event装饰器主要解决@Param装饰变量的更新问题:

  • @Param变量不能在组件内部直接修改
  • @Event提供规范的回调机制来更新数据源
  • 通过@Local的同步机制将修改同步回@Param变量

3.2 通信流程

子组件 @Event 回调 → 父组件处理方法 → 更新数据源 → 同步到 @Param 变量

四、使用示例

4.1 基本用法

@ComponentV2
struct UserInputComponent {
  // 定义事件回调
  @Event onUsernameChange: (newName: string) => void = (newName: string) => {};
  @Event onSaveRequest: () => boolean = () => false;
  
  @Local private tempUsername: string = '';
  
  build() {
    Column() {
      TextInput({ text: this.tempUsername })
        .onChange((value) => {
          this.tempUsername = value;
          // 触发事件回调
          this.onUsernameChange(value);
        })
      
      Button('保存')
        .onClick(() => {
          const result = this.onSaveRequest();
          if (result) {
            // 保存成功处理
          }
        })
    }
  }
}

4.2 父组件中使用

@Entry
@Component
struct ParentComponent {
  @State userData: UserProfile = new UserProfile('初始用户');
  
  // 处理用户名变更 - 使用箭头函数
  private handleUsernameChange = (newName: string): void => {
    this.userData.username = newName;
    console.log(`用户名更新为: ${newName}`);
  }
  
  // 处理保存请求 - 使用箭头函数
  private handleSaveRequest = (): boolean => {
    if (this.userData.isValid()) {
      this.userData.saveToDatabase();
      return true;
    }
    return false;
  }
  
  build() {
    Column() {
      UserInputComponent({
        onUsernameChange: this.handleUsernameChange, 
        onSaveRequest: this.handleSaveRequest        
      })
      
      Text(`当前用户名: ${this.userData.username}`)
        .fontSize(20)
        .margin(10)
    }
  }
}

五、注意事项

  • 只能在 @ComponentV2 装饰的组件中使用
  • 只能装饰回调函数类型的变量
  • 需要与父组件的方法签名严格匹配
  • 当@Event没有初始化时,会自动生成一个空的函数作为默认回调
  • 使用@Event修改父组件的值是立刻生效的,从父组件将变化同步回子组件的过程是异步的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值