赞
踩
this.
进行传参)$
)@Entry @Component // 父页面 struct Statemanagement { message: string = '@State装饰' @State stateMessage: string = '父组件数据' build() { Column() { Column() { Text(this.message) .titleExtend() Text(this.stateMessage) .showExtend() Button('改变State数据') .btnExtend(() => { this.stateMessage = this.stateMessage === '父页面数据' ? '父页面数据改变' : '父页面数据' }) // this.stateMessage = this.stateMessage == '父页面数据' ? '父页面数据改变' : '父页面数据' // }) } .columnSty() stateManagment_prop({ propMessage: this.stateMessage }) // stateManagment_Link({linkMessage:this.stateMessage}) // 如果是state < --- > link 参数传递时,使用$变量名进行传递 stateManagment_Link({ linkMessage: $stateMessage }) } .width('100%') .height('100%') } } // 存放一个 @Prop 装饰的状态数据。方便父子组件之间进行数据传递和同步 State ----> prop @Component struct stateManagment_prop { message: string = '@Prop装饰' @Prop propMessage: string build() { Column() { Text(this.message).titleExtend() Text('@Prop:' + this.propMessage).showExtend() Button('改变Prop组件数据') .btnExtend(() => { this.propMessage = '@Prop' }) } .columnSty() } } // 用来存放@Link数据 @Component struct stateManagment_Link { message: string = '@Link装饰' @Link linkMessage: string build() { Column() { Text(this.message).titleExtend() Text('@Link:' + this.linkMessage).showExtend() Button('改变Link组件数据') .btnExtend(() => { this.linkMessage = '@Link' }) } .columnSty() } } // Text 标题文字样式 @Extend(Text) function titleExtend() { .width('90%') .fontSize(20) .fontWeight(FontWeight.Bold) } // Text 展示文字样式 @Extend(Text) function showExtend() { .fontSize(20) .fontWeight(FontWeight.Bolder) } // column样式 @Extend(Column) function columnSty() { .margin({ top:'3vp' }) .width('95%') .height('30%') .borderStyle(BorderStyle.Solid) .borderColor(Color.Black) .border({ width: 1 }) .justifyContent(FlexAlign.SpaceAround) } // button样式 @Extend(Button) function btnExtend(click: Function) { .fontSize(30) .height('40vp') .onClick(() => { click() }) }
@Provide和@Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递,@Provide和@Consume摆脱参数传递机制的束缚,实现跨层级传递。
其中@Provide装饰的变量是在祖先节点中,可以理解为被“提供”给后代的状态变量。@Consume装饰的变量是在后代组件中,去“消费(绑定)”祖先节点提供的变量。
@Provide/@Consume装饰的状态变量有以下特性:
// 相同的变量名
@Provide wechat:string = '学习鸿蒙'
@Consume wechat: string
// 相同的变量别名
@Provide('shy') wechat:string = '学习鸿蒙'
@Consume('shy') wechat_son: string
@Provide和@Consume通过相同的变量名或者相同的变量别名绑定时,@Provide修饰的变量和@Consume修饰的变量是一对多的关系。不允许在同一个自定义组件内,包括其子组件中声明多个同名或者同别名的@Provide装饰的变量。
@Entry @Component struct ProvideConsume { @Provide('theshy') wechat: string = '微信公众号' build() { Row() { Column({ space: 20 }) { Text(this.wechat).ProvideConsume_textStyle() .onClick(() => { this.wechat = '不多讲故事' }) Divider() // 父调用子。 ProvideConsume_son() }.width('100%') }.height('100%') } } @Component struct ProvideConsume_son { build() { Column({ space: 20 }) { Text('子组件的布局内容:').ProvideConsume_textStyle() Divider() // 调用孙组件 ProvideConsume_sun() } } } @Component struct ProvideConsume_sun { @Consume('theshy') study: string build() { Column() { Text('孙:' + this.study).ProvideConsume_textStyle() .onClick(() => { this.study = 'HarmonyOS4.0' }) } } } @Extend(Text) function ProvideConsume_textStyle() { .fontSize(30) .fontWeight(700) }
@Watch应用于对状态变量的监听。如果开发者需要关注某个状态变量的值是否改变,可以使用@Watch为状态变量设置回调函数。
@Watch用于监听状态变量的变化,当状态变量变化时,@Watch的回调方法将被调用。@Watch在ArkUI框架内部判断数值有无更新使用的是严格相等(===),遵循严格相等规范。当在严格相等为false的情况下,就会触发@Watch的回调。
@Watch补充变量装饰器 | 说明 |
---|---|
装饰器参数 | 必填。常量字符串,字符串需要有引号。是(string) => void自定义成员函数的方法的引用。 |
可装饰的自定义组件变量 | 可监听所有装饰器装饰的状态变量。不允许监听常规变量。 |
装饰器的顺序 | 建议@State、@Prop、@Link等装饰器在@Watch装饰器之前。 |
类型 | 说明 |
---|---|
(changedPropertyName? : string) => void | 该函数是自定义组件的成员函数,changedPropertyName是被watch的属性名。 |
在多个状态变量绑定同一个@Watch的回调方法的时候,可以通过changedPropertyName进行不同的逻辑处理 | |
将属性名作为字符串输入参数,不返回任何内容。 | |
函数中,不要不要不要修改被监视的状态变量(会陷入无限死循环)。 我们要操作的是其他的业务逻辑 |
/* * @Watch 修饰 状态数据 * 函数中,不要不要不要修改被监视的状态变量。 我们要操作的是其他的业务逻辑 * */ @Entry @Component struct WatchDct { @State @Watch('change') count: number = 1 @State @Watch('change') pow: number = 2 @State res: number = 1 change() { // this.count = this.count + 2 无限循环 this.res = Math.pow(this.count, this.pow) } build() { Row() { Column() { Text('基数:' + this.count) .fontSize(50) .onClick(() => { this.count++ }) Divider() Text(`次幂:${this.pow}`) .fontSize(50) .onClick(() => { this.pow++ }) Divider() Text("结果:" + this.res) .fontSize(50) } .width('100%') } .height('100%') } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。