Harmony状态管理@Event

Harmony状态管理@Event

背景

在上一节中,我们针对父子组件,讲了关于传递数据的知识。我们了解到

  1. @Local 是管理自己内部的数据的,
  2. @Param 是负责接收父组件的数据的,而且子自己内部不能直接修改

按照一个组件最基本的功能,既能接收外部传入的数据也要向外部传递数据 。那么 @Event 修饰符就是来解决这个问题的了。

介绍

@Event 是 子组件向父组件传递数据的技术,它只能用在 @ComponentV2 修改的组件上,其中的思想是

  1. 完成修改数据的操作,还是放在父组件内部,通过定义一个函数 func 来实现
  2. 在父组件调用子组件的时候,也顺带把这个函数 func 传递给子组件
  3. 子组件在内部 使用 @Event 来修饰 该函数,并且在需要的使用直接调用即可

父组件

  1. 定义内部数据 num

  2. 定义修改内部数据num的函数 func

  3. 使用子组件时,把numfunc都传递过去

    @Entry
    @ComponentV2
    struct Index {
    @Local num: number = 100
    // 自己定义的函数 负责修改数据, 该函数也要传递给子组件
    func = (unit: number) => {
    this.num -= unit
    }

    build() {
    Column() {
    Button("父组件 修改" + this.num)
    .onClick(() => {
    this.num++
    })
    // 使用子组件,并且传递数据 和 传递函数
    Son({ num: this.num, func: this.func })
    .padding(10)
    }
    .width("100%")

    }
    }

子组件

  1. 使用 @Param 接收父组件传递的 num

  2. 使用@Event 接收父组件传递的函数 func

  3. 定义点击事件的处理函数 onfunc,内部直接调用父组件传递过来的函数

    @ComponentV2
    struct Son {
    @Param num: number = 0
    @Event func: (num: number) => void = () => {
    }
    onfunc = () => {
    this.func(5)
    }

    build() {

    复制代码
     Column() {
       Button(`子组件 ${this.num}`)
    
       Button("子组件修改父组件中的状态")
         .onClick(this.onfunc)
     }
     .border({
       width: 1,
       style: BorderStyle.Dashed
     })

    }
    }

流程

@Once

@Once@Param作用类似,都可以表示接收父组件传递过来的数据,但是也存在区别

  1. @Once 只会接收第一次父组件传递过来的数据,后续父组件的数据修改,不会同步到 @Once修改的变量上

  2. @Once 需要和 @Param 一起搭配使用,因为 @Param 修饰的是父组件传递给子组件的变量,该变量不能直接被修改。所以@Once修饰的变量,也不能在子组件内部直接修改。

    @ComponentV2
    struct Son {
    @Once @Param num: number = 0

    build() {
    Column() {
    Button(子组件 ${this.num})
    .onClick(() => {
    this.num++ // 修改无效
    })
    }
    .border({
    width: 1,
    style: BorderStyle.Dashed
    })
    }
    }

    @Entry
    @ComponentV2
    struct Index {
    @Local num: number = 100

    build() {
    Column() {

    复制代码
       Son({ num: this.num })
         .padding(10)
     }
     .width("100%")

    }
    }

总结

  1. @Param 表示父组件传递给子组件的数据,当父组件修改了,子组件会跟随响应,同时子组件内部不能直接修改 @Param修饰的变量
  2. @Event 表示子组件想要修改父组件数据的一种技术,它用来修改函数,该函数是由父组件定义和传递给子组件的
  3. @Once 必须和 @Param 搭配使用,表示父组件传递过来的数据,只会第一次生效。
相关推荐
UnicornDev10 小时前
【HarmonyOS 6】空状态页面布局设计
华为·harmonyos·arkts·鸿蒙·鸿蒙系统
互联网散修17 小时前
零基础鸿蒙应用开发第十九节:解锁灵活数据存储新技能Map/Set
harmonyos
枫叶丹417 小时前
【HarmonyOS 6.0】ArkData 应用间配置共享:构建跨应用协作新范式
开发语言·华为·harmonyos
互联网散修18 小时前
零基础鸿蒙应用开发第十八节:内置泛型工具类型应用
harmonyos
轻口味18 小时前
HarmonyOS 6 自定义人脸识别模型8:MindSpore Lite框架介绍与使用
c++·华为·ai·harmonyos
枫叶丹418 小时前
【HarmonyOS 6.0】ArkData 分布式数据对象新特性:资产传输进度监听与接续传输能力深度解析
开发语言·分布式·华为·wpf·harmonyos
枫叶丹418 小时前
【HarmonyOS 6.0】Agent Framework Kit深度解析:构建应用与智能体的无缝连接
华为·aigc·harmonyos
亚历克斯神1 天前
Flutter for OpenHarmony: Flutter 三方库 mutex 为鸿蒙异步任务提供可靠的临界资源互斥锁(并发安全基石)
android·数据库·安全·flutter·华为·harmonyos
钛态1 天前
Flutter 三方库 smartstruct 鸿蒙化字段映射适配指南:介入静态预编译引擎扫除视图及数据模型双向强转类型错乱隐患,筑稳如磐石的企业级模型治理防线-适配鸿蒙 HarmonyOS ohos
flutter·华为·harmonyos
键盘鼓手苏苏1 天前
Flutter 组件 csv2json 适配鸿蒙 HarmonyOS 实战:高性能异构数据转换,构建 CSV 流式解析与全栈式数据映射架构
flutter·harmonyos·鸿蒙·openharmony