HarmonyOS 鸿蒙Next 装饰器传递给子组件的状态变量被修改后,父组件中对应字段没有同步修改

发布于 1周前 作者 sinazl 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 装饰器传递给子组件的状态变量被修改后,父组件中对应字段没有同步修改

点击自定义组件中的 Column 并没有更新 this.mTestViewModel.switchState的内容, 如何进行自定义组件swtichState 和 this.mTestViewMode.switchState 的双向绑定, 更新自定义组件中swtichState时候,this.mTestViewModel.switchState 也会被更新 
 


更多关于HarmonyOS 鸿蒙Next 装饰器传递给子组件的状态变量被修改后,父组件中对应字段没有同步修改的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

1、基础类型使用 @state 或者 @link 2、数据多层嵌套的情况下,目前是采用Observed + ObjectLInk

针对上述问题demo,给出优化代码如下:

@Entry

@Component

struct Page249053 {

  @State mTestViewModel: TestViewModel = TestViewModel.getInstance()

  build() {

    Column() {

      ForEach(this.mTestViewModel.bol, (item:boolean,index:number) => {

        SwitchView({

          mTestViewModel: this.mTestViewModel,

          index:index

        })

        Text(item+'88787878+')

      }, (item: string) => item)

    }

  }

}

@Component

struct SwitchView {

  @Link mTestViewModel: TestViewModel

  @State index:number=0

  build() {

    Column()

      .width(40)

      .height(40)

      .margin({bottom:20})

      .backgroundColor(this.mTestViewModel.bol[this.index] ? Color.Red : Color.Green)

      .onClick(() => {

        console.log(this.index+'09999')

        this.mTestViewModel.bol= this.mTestViewModel.bol.map((item,index)=>{

          if(index==this.index){

            return !item

          }else {

            return item

          }

        })

        console.log( this.mTestViewModel.bol+'99898989')

      })

  }

}

@Observed

export class TestViewModel {

  private static instance: TestViewModel;

  public static getInstance(): TestViewModel {

    if (!TestViewModel.instance) {

      TestViewModel.instance = new TestViewModel();

    }

    return TestViewModel.instance;

  }

  public switchState: boolean = false

  public switchState1: boolean = false

  public switchState2: boolean = false

  public switchState3: boolean = false

  public bol:boolean[]=[false,false,false,false]

}

更多关于HarmonyOS 鸿蒙Next 装饰器传递给子组件的状态变量被修改后,父组件中对应字段没有同步修改的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,装饰器(Decorator)传递状态变量给子组件时,如果子组件内部修改了这些状态变量,默认情况下并不会自动同步回父组件。这是因为状态变量的传递通常是单向的,即父组件传递数据给子组件,但子组件的修改不会反向影响父组件。

这种机制是为了维护组件间的独立性和数据的单向流动,以避免复杂的状态管理和潜在的循环依赖问题。在鸿蒙系统中,如果你需要在子组件修改状态后同步更新父组件,可以通过以下几种方式实现:

  1. 事件回调:子组件在修改状态后,通过事件机制通知父组件,父组件再根据事件处理逻辑更新自己的状态。

  2. 数据绑定与监听:利用鸿蒙提供的数据绑定机制,父组件可以监听子组件的某些属性变化,并自动更新自己的状态。

  3. 全局状态管理:对于复杂的应用,可以考虑使用全局状态管理框架或工具,来集中管理应用的状态,所有组件都通过该框架来获取和更新状态。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部