HarmonyOS鸿蒙开发组件状态管理详细说明(State、Prop、Link、Provide和Consume、Watch、ObjectLink和Observed)

本文详细介绍了React中的组件状态管理方法,包括@State用于本地状态管理,@Prop和@Link进行父子组件间的单向/双向数据同步,@Provide和@Consume用于跨层级状态传递,以及@Watch用于监视状态变化。还特别强调了对象链接(@ObjectLink)和观察(@Observed)如何处理嵌套属性的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组件状态管理

关注’猿来编码‘,微信订阅号,回复 ’组件状态‘,获取详细




一、@State

@State用于装饰当前组件的状态变量,@State装饰的变量在发生变化时,会驱动当前组件的视图刷新,语法如下:

@State count:number = 1;

需要注意的是:@State装饰的变量必须进行本地初始化。

允许装饰的类型
基本类型:string、number、boolean、enum
对象类型:json对象、class的实例对象、
数组类型:上面所有类型的数组
能够观察到的变化
注意:
并不是状态变量的所有更改都会引起UI的刷新
只有可以被框架观察到的修改才会引起UI刷新
属性本身的改变都可以 (无论什么类型)
对象:能监视对象的直接属性变化,不能监视嵌套属性的改变
数组:能监视数组中元素的变化,不能监视元素对象内部的变化
测试
定义对象和数组的状态和显示数据

@State @Watch('onChange')obj: {
   a: {
   b: number}} = {
   a: {
   b: 1}}
@State @Watch('onChange2')arr: {
   a: number}[] = [{
   a: 1}]
Text('state.obj' + JSON.stringify(this.obj)).fontSize(18)
Text('state.arr' + JSON.stringify(this.arr)).fontSize(18)

修改属性对象

this.obj = {
   a: {
   b: 2}}   // 修改属性本身 => 能监视

this.obj.a = {
   b: 3}  // 修改属性对象的直接属性 =》 能监视

this.obj.a.b = 4   // 修改属性对象的嵌套属性 =》 不能监视到

修改属性数组

this.arr = [] // 修改属性本身 => 能监视

this.arr[0] = {
   a: 2} // 修改属性数组的元素 => 能监视

this.arr.push({
   a: 3}) // 修改属性数组的元素 => 能监视

this.arr[0].a = 4 // 修改属性数组的元素对象内部属性 =》 不能监视

二、@Prop

@Prop用于装饰子组件的状态变量,@Prop装饰的变量会同步父组件的状态,但只能单向同步,也就是父组件的状态变化会自动同步到子组件,而子组件的变化不会同步到父组件。
父组件

@Entry
@Component
struct Parent{
   
  @State count:number = 1;
  build(){
   
    Column(){
   
      Child({
   count:this.count});
    }
  }
}

子组件

@Component
export struct Child{
   
  @Prop count:number;
  build(){
   
    Text('prop.count: ' + this.count);
  }
}

需要注意的是:@Prop装饰的变量不允许本地初始化,只能通过父组件传参进行初始化。
允许装饰的类型
官方文档:只允许基本类型,不允许对象和数组
实际情况:与@State一致,可以是对象、数组
能够观察到的变化
与@State一致

三、@Link

@Link用于装饰子组件的状态变量,@Prop变量同样会同步父组件状态,但是能够双向同步。也就是父组件的变化会同步到子组件,而子组件的变化也会同步到父组件。
父组件

@Entry
@Component
struct Parent{
   
  @State count:number = 1;
  build(){
   
    Column(){
   
      Child({
   count: $count});
    }
  }
}

子组件

@Component
export struct Child{
   
  @Link count:number;
  build(){
   
    Text('link.count: ' + this.count);
  }
}

需要注意的是:@Link装饰的变量不允许本地初始化,只能由父组件通过传参进行初始化,并且父组件必须使用$变量名的方式传参,以表示传递的是变量的引用。
允许装饰的类型
与@State一致
框架能够观察到的变化
与@State一致

四、@Provide 与 @Consume

@Provide和@Consume用于跨层级传递状态信息,其中@Provide用于装饰祖先组件的状态变量,@Consume用于装饰后代组件的状态变量。可以理解为祖先组件提供(Provide)状态信息供后代组件消费(Consume),并且祖先和后代的状态信息可以实现双向同步。
注意:
@Provide装饰变量必须本地初始化,而@Consume装饰的变量不允许本地初始化。
@Provide & @Consume处理的状态数据是双向同步的

祖先组件

@Entry
@Component
struct GrandParent {
   
    @Provide count
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值