HarmonyOS鸿蒙Next V2 状态监听 @Event
HarmonyOS鸿蒙Next V2 状态监听 @Event
HarmonyOS Next V2 状态监听 @Event
背景
在上一节中,我们针对父子组件,讲了关于传递数据的知识。我们了解到
<code>@Local</code>是管理自己内部的数据的,<code>[@Param](/user/Param)</code>是负责接收父组件的数据的,而且子自己内部不能直接修改
按照一个组件最基本的功能,既能接收外部传入的数据,也要向外部传递数据。那么 `@Event 修饰符就是来解决这个问题的了。
介绍
[@Event](/user/Event) 是 子组件向父组件传递数据的技术,它只能用在 <code>[@ComponentV2](/user/ComponentV2)</code> 修改的组件上,其中的思想是
- 完成修改数据的操作,还是放在父组件内部,通过定义一个函数
<code>func</code>来实现 - 在父组件调用子组件的时候,也顺带把这个函数
<code>func</code>传递给子组件 - 子组件在内部 使用
<code>[@Event](/user/Event)</code>来修饰 该函数,并且在需要的使用直接调用即可
父组件
- 定义内部数据
<code>num</code> - 定义修改内部数据
<code>num</code>的函数<code>func</code> - 使用子组件时,把
<code>num</code>和<code>func</code>都传递过去
@Entry
[@ComponentV2](/user/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")
}
}
子组件
- 使用
<code>[@Param](/user/Param)</code>接收父组件传递的<code>num</code> - 使用
<code>[@Event](/user/Event)</code>接收父组件传递的函数<code>func</code> - 定义点击事件的处理函数
<code>onfunc</code>,内部直接调用父组件传递过来的函数
[@ComponentV2](/user/ComponentV2)
struct Son {
[@Param](/user/Param) num: number = 0
[@Event](/user/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
<code>[@Once](/user/Once)</code> 和 <code>[@Param](/user/Param)</code>作用类似,都可以表示接收父组件传递过来的数据,但是也存在区别
<code>[@Once](/user/Once)</code>只会接收第一次父组件传递过来的数据,后续父组件的数据修改,不会同步到<code>[@Once](/user/Once)</code>修改的变量上<code>[@Once](/user/Once)</code>需要和<code>[@Param](/user/Param)</code>一起搭配使用,因为<code>[@Param](/user/Param)</code>修饰的是父组件传递给子组件的变量,该变量不能直接被修改。所以<code>[@Once](/user/Once)</code>修饰的变量,也不能在子组件内部直接修改。
[@ComponentV2](/user/ComponentV2)
struct Son {
[@Once](/user/Once) [@Param](/user/Param) num: number = 0
build() {
Column() {
Button(`子组件 ${this.num}`)
.onClick(() => {
this.num++ // 修改无效
})
}
.border({
width: 1,
style: BorderStyle.Dashed
})
}
}
@Entry
[@ComponentV2](/user/ComponentV2)
struct Index {
@Local num: number = 100
build() {
Column() {
Son({ num: this.num })
.padding(10)
}
.width("100")
}
}

总结
<code>[@Param](/user/Param)</code>表示父组件传递给子组件的数据,当父组件修改了,子组件会跟随响应,同时子组件内部不能直接修改<code>[@Param](/user/Param)</code>修饰的变量<code>[@Event](/user/Event)</code>表示子组件想要修改父组件数据的一种技术,它用来修改函数,该函数是由父组件定义和传递给子组件的<code>[@Once](/user/Once)</code>必须和<code>[@Param](/user/Param)</code>搭配使用,表示父组件传递过来的数据,只会第一次生效。
更多关于HarmonyOS鸿蒙Next V2 状态监听 @Event的实战教程也可以访问 https://www.itying.com/category-93-b0.html
HarmonyOS鸿蒙Next V2中的状态监听通过@Event注解实现。@Event用于标记一个方法,使其能够接收和处理特定的事件。开发者可以通过在方法上添加@Event注解,并指定事件类型,来监听和响应系统或自定义事件。事件类型可以是系统预定义的事件,如屏幕旋转、网络状态变化等,也可以是开发者自定义的事件。@Event注解的方法会在事件触发时自动调用,从而实现对状态的监听和响应。开发者需要在Ability或AbilitySlice中定义这些方法,并确保它们符合事件处理方法的签名要求。通过这种方式,HarmonyOS可以实现高效的事件驱动编程模型。
更多关于HarmonyOS鸿蒙Next V2 状态监听 @Event的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next V2中,状态监听可以通过@Event注解实现。@Event用于标记事件处理方法,当特定事件发生时,系统会自动调用该方法。例如,监听按钮点击事件:
@Event('click')
onClick(event: Event): void {
console.log('Button clicked');
}
@Event简化了事件处理的绑定过程,开发者只需关注事件处理逻辑,无需手动绑定事件监听器。这种机制提升了开发效率,降低了代码复杂度。

