鸿蒙学习笔记
第七节 状态管理
在一个Entry中,子组件与父组件的通信似乎有很大的问题,
例如C++中有模板和指针,java中的引用都能完成通信,
鸿蒙中也同样有传递方法的工具
第一种单方面通信,类似与c++中的模板如int a(PII p),
就是里面不能修改外面的值,但是那是组件与组件
之间的通信,与普通传方法不同
这种情况是要在子组件中被传入的加入@Prop注解,且子组件不能有初值,
如果没有加Prop注解想要传,那么也不能加@State,因此即使改变值也不会
刷新子组件的build方法
效果:这种情况下该变父组件的值会直接改变子组件的值,但是反过来不行
例如:
struct Index7 {
@State message: string = "状态管理"
build() {
Row() {
Column() {
Text(this.message)
.Index7_textStyle()
Button("按钮1").Index7_btnStyle(()=>{
this.message = this.message === 'Default'?"Successful":"Default"
})
StateManagerProp({value_prop:this.message})
StateManagerLink({value_link:$message})
}
.width('100%')
}
.height('100%')
}
}
@Component
struct StateManagerProp{
@Prop value_prop : string; //@Prop不能复值
build(){
Column(){
Text(this.value_prop).Index7_textStyle()
Button("动态prop数据").Index7_btnStyle(()=>{
this.value_prop = "hello sqweqwrb"
})
}
}
}
//第二种双方面通信,类似与c++中的模板如int a(PII &p),
//就是里面能修改外面的值
//这种情况是要在子组件中被传入的加入@Link注解
//,且子组件不能有初值,
//效果:这种情况双方能互相改变了
@Component
struct StateManagerLink{
@Link value_link : string; //@Link不能复值
build(){
Column(){
Text(this.value_link).Index7_textStyle()
Button("动态link数据").Index7_btnStyle(()=>{
this.value_link = "hello sqweqwrblink"
})
}
}
}
//所有文本的统一设置
@Extend(Text) function Index7_textStyle() {
.fontSize(32)
.fontWeight(FontWeight.Bold)
.fontColor(Color.Orange)
}
//所有button的统一设置
@Extend(Button) function Index7_btnStyle(fun:Function){
.fontSize(33)
.onClick(()=>{
fun()
})
}