当前位置: 首页 > news >正文

鸿蒙5.0应用开发——V2装饰器@Event的使用

【高心星出品】

文章目录

      • V2装饰器@Event的使用
        • 概念
        • 装饰器说明
        • 应用场景
        • 案例

V2装饰器@Event的使用

概念

由于@Param装饰的变量在本地无法更改,使用@Event装饰器装饰回调方法并调用,可以实现更新数据源的变量,再通过@Local的同步机制,将修改同步回@Param,以此达到主动更新@Param装饰变量的效果。

@Event用于装饰组件对外输出的方法:

  • @Event装饰的回调方法中参数以及返回值由开发者决定。
  • @Event装饰非回调类型的变量不会生效。当@Event没有初始化时,会自动生成一个空的函数作为默认回调。
  • 当@Event未被外部初始化,但本地有默认值时,会使用本地默认的函数进行处理。

@Param标志着组件的输入,表明该变量受父组件影响,而@Event标志着组件的输出,可以通过该方法影响父组件。使用@Event装饰回调方法是一种规范,表明该回调作为自定义组件的输出。父组件需要判断是否提供对应方法用于子组件更改@Param变量的数据源。

装饰器说明
@Event属性装饰器说明
装饰器参数无。
允许装饰的变量类型回调方法,例如()=>void、(x:number)=>boolean等。回调方法是否含有参数以及返回值由开发者决定。
允许传入的函数类型箭头函数。
  1. 通信桥梁
    @Event装饰的回调方法作为子组件的“输出口”,允许子组件主动触发父组件逻辑。当子组件需要修改父组件传递的@Param变量时(由于@Param本地不可直接修改),通过调用@Event装饰的方法通知父组件更新数据源。
  2. 与@Param的协作
    • 父组件通过@Param传递数据给子组件
    • 子组件通过@Event回调请求父组件修改数据源
    • 父组件更新后的数据通过@Local同步机制回传给子组件
应用场景
  1. 表单输入组件
    子组件(如自定义输入框)通过@Event将用户输入实时同步到父组件数据源。
  2. 状态联动更新
    当多个子组件需要基于同一父级状态协同变化时,通过事件回调统一管理状态。
  3. 动态配置传递
    父组件传递初始配置后,子组件通过事件回调请求调整配置参数。
案例

双向同步案例。

父组件结构(Eventpage):

  • 使用@Local管理状态变量count
  • 通过eventchild({count: this.count, cb: …})向子组件传递数据与回调
  • 在回调函数内通过this.count += val响应子组件事件

子组件结构(eventchild):

  • 通过@Param count: number接收父组件的状态
  • 通过@Event cb: (val: number) => void定义事件回调接口
  • 点击按钮时通过this.cb(2)触发父组件逻辑

在这里插入图片描述

@ComponentV2
struct eventchild{@Require @Param count:number@Event cb:(val:number)=>voidbuild() {Column(){Button('child count: '+this.count).width('60%').onClick(()=>{// @param不允许直接更新count// this.count++// 可以通过@event对外暴漏一个出口,间接让父组件更新父组件的变量this.cb(2)})}.width('100%').padding(20)}
}@Entry
@ComponentV2
struct Eventpage {@Local count: number = 10;build() {Column(){Button('page count: '+this.count).width('60%').onClick(()=>{this.count++})// 重写@event函数eventchild({count:this.count,cb:(val:number)=>{// 更新父组件的count  会同步到子组件this.count+=val}})}.height('100%').width('100%')}
}

单向同步案例,并且是子控制父,父无法控制子。

父组件结构:

  • 使用@Local装饰器定义响应式数组arr,并通过按钮点击事件修改数组第一个元素
  • 通过eventchild1子组件传递处理后的数组(使用[…this.arr]进行解构)和事件回调函数

子组件结构:

  • 通过@Param接收父组件传递的数组
  • 通过@Event定义事件回调接口cb
  • 点击按钮触发回调函数向父组件传递参数

在这里插入图片描述

@ComponentV2
struct eventchild1{@Require @Param arr:number[]@Event cb:(val:number)=>voidbuild() {Column(){Button('child count: '+this.arr[0]).width('60%').onClick(()=>{// 双向同步关系// this.arr[0]++// 单向同步关系,子组件能控制父组件的显示,父组件不会同步过来// 使用的深度拷贝 没有引用this.cb(1)})}.width('100%').padding(20)}
}@Entry
@ComponentV2
struct Eventpage1 {@Local arr: number[] = [1,2,3];build() {Column(){Button('page count: '+this.arr[0]).width('60%').onClick(()=>{this.arr[0]++})// 重写@event函数// 现在子组件和父组件都是使用数组的引用,建立双向同步// 同时改变// eventchild1({arr:this.arr,cb:(val:number)=>{//   this.arr[0]+=val// }})// 单向同步关系,子组件能控制父组件的显示,父组件不会同步过来// 使用的深度拷贝 没有引用eventchild1({arr:[...this.arr],cb:(val:number)=>{this.arr[0]+=val}})}.height('100%').width('100%')}
}

通过合理运用@Event,开发者能构建出高内聚、低耦合的组件化架构,实现ArkTS应用中灵活的数据流控制。


文章转载自:

http://fiALrMDG.zsthg.cn
http://EZGg4HTA.zsthg.cn
http://vuncAu3S.zsthg.cn
http://N42cD0QY.zsthg.cn
http://Izp3ejdU.zsthg.cn
http://W2rt8kA5.zsthg.cn
http://vex8cL1o.zsthg.cn
http://yK4DatYi.zsthg.cn
http://ct4vkNdK.zsthg.cn
http://GULcrRYC.zsthg.cn
http://0CwipWSk.zsthg.cn
http://GfICRPMK.zsthg.cn
http://vUll8FOu.zsthg.cn
http://UGlQdPpk.zsthg.cn
http://VnlGWTFB.zsthg.cn
http://QiA6JH6g.zsthg.cn
http://DzllYevA.zsthg.cn
http://q2gI6kwO.zsthg.cn
http://U4onnT5w.zsthg.cn
http://3IpA55Ic.zsthg.cn
http://aKtVUd9X.zsthg.cn
http://zvcaDJ3Z.zsthg.cn
http://hmI7H5Wa.zsthg.cn
http://QFdR6BOR.zsthg.cn
http://A9YCEJr4.zsthg.cn
http://Zt8TIcZg.zsthg.cn
http://TtLjwuvH.zsthg.cn
http://f8tIupLh.zsthg.cn
http://f1cVhPxo.zsthg.cn
http://oISXfYpn.zsthg.cn
http://www.dtcms.com/a/388048.html

相关文章:

  • logstash同步mysql流水表到es
  • Ground Control-卫星通信 (SATCOM) 和基于蜂窝的无人机和机器人物联网解决方案
  • 计算机视觉技术深度解析:从图像处理到深度学习的完整实战指南
  • 互联网大厂Java面试:从Spring Boot到微服务的实战考验
  • k8s NodePort 30000 - 32767 被用完后该如何处理
  • 高级系统架构师笔记——软件工程基础知识(2)RAD/敏捷模型/CMM/CBSE
  • 【C++】C++类和对象—(中)
  • React 记忆缓存使用
  • 图观 流渲染场景服务编辑器
  • WALL-OSS——点燃QwenVL 2.5在具身空间中的潜力:VL FFN可预测子任务及离散动作token,Action FNN则预测连续动作
  • 设备中断绑定于香港服务器高性能容器的优化方法
  • 物理服务器具体是指哪些
  • Hive内部表外部表分区分桶数据类型
  • THREE练习写了几个简单小游戏的总结
  • Flume与Sqoop核心知识点总结:Hadoop生态的数据传输双引擎
  • 微服务spring cloud alibabab 启动报错: No spring.config.import set
  • 开心实习之第n天
  • 【系列文章】Linux系统中断的应用04-共享工作队列实验
  • Java的jdk21与 Go语言对比
  • 告别 MaaS 模型选型困难:AI Ping 为大模型服务选型提供精准性能评测排行榜
  • 41.OpenCV入门:计算机视觉的瑞士军刀
  • 初识golang
  • UE5 the “XXX“plugin was designed for build XXX,Attempt to load it anyway
  • docker快速安装环境
  • 如何安装TraeCN(字节跳动的IDE)使用AI IDE书写Vue3数据可视化大屏项目
  • Spark NLP: 最先进的自然语言处理和LLM库
  • 基于国产银河麒麟服务器SP3项目实战(Nginx+Keepalive)实现高可用负载均衡
  • 每日随机展示10个wordpress置顶文章
  • Leecode hot100 - 303. 区域和检索
  • 【审计试题案例】