前言
ETS(基于 TS 扩展的声明式开发范式)提供了强大的组件化能力,支持开发者高效的构建应用的 UI 界面,然而每一个组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互进行直接的引用,因此组件间的相互通信是非常重要的。
组件间通信原理
ETS 组件间通信是通过组合不同的装饰器来实现数据在各个组件之间的单向/双向传递。
相关装饰器介绍
组件间通信实现
父子组件通信
数据单向传递
使用 @State 和 @Prop 装饰器可以实现父组件向子组件单向传递数据。
●定义子组件 Child
@Component
struct Child {
@Watch("listenChildCount") //当count变量值发生变化,会调用listenChildCount()
@Prop
count: number;
build() {
Column() {
Text("子组件:" + this.count).fontSize(30)
Button("reduce")
.fontSize(25)
.onClick(() => {
this.count--;
})
}
.border({ width: 2, color: Color.Blue })
.backgroundColor(Color.Green)
.width("50%")
.height("50%")
}
/**
* 用于监听count变量的变化
*/
listenChildCount() {
console.info("ChildComponent count changed:" + this.count)
}
}
●定义父组件,在父组件中嵌套子组件 Child,并将父组件中的 count 变量传递给子组件
@Entry
@Component
struct Parent {
@State
@Watch("listenCount") //当count变量值发生变化,会调用listenCount()
count: number = 0;
build() {
Column() {
Column() {
Text("父组件:" + this.count)
.fontSize(30)
.fontColor(Color.Red)
Button("add")
.fontColor(Color.White)
.fontSize(30)
.backgroundColor(Color.Orange)
.onClick(() => {
this.count++;
})
Child({ count: this.count })
}.border({ width: 2, color: Color.Black })
.width("100%")
.height(400)
.backgroundColor(Color.Gray)
}
}
listenCount() {
console.info("ParentComponent count changed:" + this.count)
}
}
效果如下: