当前位置: 首页 > 知识库问答 >
问题:

harmonyos - 子组件修改父组件的问题,求助大佬?

窦彦君
2024-03-07

子组件修改父组件的问题,求助大佬
这里说法是不是矛盾的,是我理解能力不够吗?测试代码,也是,父组件修改子组件能刷新,子组件修改父组件没反应,那个大佬能帮我看看是不是我代码有问题,还是文档有问题:

@Observedclass ClassA {  public value: number;  constructor(value: number) {    this.value = value;  }}class ClassB {  public a: ClassA;  constructor(a: ClassA) {    this.a = a;  }}class ClassC {  public b: ClassB;  constructor(b: ClassB) {    this.b = b;  }}@Componentstruct ViewA {  label: string = 'ViewA';  @ObjectLink a: ClassA;  build() {    Row() {      Column({space:10}) {        Text(`[${this.label}] this.a.value = ${this.a.value}`)          .fontSize(20)        Button(`ViewA: this.a.value add 1`)          .backgroundColor('#ff7fcf58')          .onClick(() => {            this.a.value += 1            console.log('this.a.value:' + this.a.value)          })      }      .width("100%")    }  }}
@Entry@Componentstruct ViewB {  @State child: ClassC = new ClassC(new ClassB(new ClassA(10)));  build() {    Column({space:10}) {      ViewA({ a:this.child.b.a })      Text(`ViewB:${this.child.b.a.value}`)      Button(`ViewB: this.c.b.a.value add 10`)        .backgroundColor('#ff7fcf58')        .onClick(() => {          this.child.b.a.value += 10          console.log('this.child.b.a.value:' + this.child.b.a.value)        })    }  }}

文档地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides...

本文参与了 思否 HarmonyOS 技术问答马拉松,欢迎正在阅读的你也加入。

共有1个答案

赫连明诚
2024-03-07

在编程中,通常子组件不应该直接修改父组件的状态或属性。这是因为子组件应该是被动的,只负责显示父组件传递下来的数据,并且响应父组件的状态变化。如果子组件需要修改父组件的状态,通常应该通过事件或回调函数的方式通知父组件,由父组件自己决定如何修改状态。

在你提供的代码中,ViewA 组件试图直接修改 ClassA 实例的 value 属性,而 ClassA 实例是通过 ObjectLink 传递给 ViewA 的。然而,由于 ClassA 使用了 @Observed 装饰器,它的状态变化应该是可以观察的,这意味着当 value 属性变化时,相关的界面应该会刷新。

不过,在 ViewB 组件中,ClassA 的实例是作为 ClassC 的属性间接传递给 ViewA 的。这意味着当你试图通过 ViewA 的按钮来修改 ClassAvalue 属性时,ViewB 组件可能无法观察到这个变化,因为 ViewB 只直接观察了 ClassC 的状态,而没有观察 ClassC 内部属性的变化。

为了解决这个问题,你可以尝试以下几种方法:

  1. 使用事件或回调函数:让 ViewAvalue 属性变化时发出一个事件或调用一个回调函数,通知 ViewB 更新其显示。
  2. 使用可观察的对象:确保 ClassCClassB 的状态也是可观察的,这样当 ClassAvalue 属性变化时,ViewB 可以观察到 ClassCClassB 的状态变化。
  3. 使用状态管理工具:如果你正在开发一个复杂的应用,考虑使用状态管理工具(如 Redux、MobX 等)来管理状态,这样你可以更容易地跟踪和更新状态。

另外,请确保你正在使用的框架或库(在这个情况下是 HarmonyOS)支持你所尝试的这种方法,并且你正确地使用了相关的 API 和装饰器。

最后,由于我没有运行你的代码,以上只是基于你提供的代码和描述的分析和建议。如果问题仍然存在,你可能需要进一步检查代码或查阅相关文档。

 类似资料:
  • 问题描述 编写树形结构组件碰到的问题。父组件传递的数据是没有控制样式的这些属性的。子组件在接受数据后增加了一些控制样式的属性。但是在修改这些增加的属性时控制台报错。 相关代码 父组件 子组件 控制台报错 问题出现的环境背景及自己尝试过哪些方法 这个属性可以在控制台打印出来,但是修改的时候却又找不到了。

  • 子组件事件能否到传递父组件

  • 本文向大家介绍浅谈Vue父子组件和非父子组件传值问题,包括了浅谈Vue父子组件和非父子组件传值问题的使用技巧和注意事项,需要的朋友参考一下 本文介绍了浅谈Vue父子组件和非父子组件传值问题,分享给大家,具体如下: 1.如何创建组件 1.新建一个组件,如:在goods文件夹下新建goodsList.vue 2.在main.js中引入 import goodsList from 'goods/good

  • 本文向大家介绍vue里面父组件修改子组件样式的方法,包括了vue里面父组件修改子组件样式的方法的使用技巧和注意事项,需要的朋友参考一下 在使用 vue 的开发中,我们有时会引用外部组件,包括 UI 组件(ElementUI、iview)。 当 <style> 标签有 scoped 属性时,它的 CSS 只作用于当前组件中的元素。 但是在父组件中添加 scoped 之后,父组件的样式将不会渗透到子组

  • 本文向大家介绍vuejs父子组件通信的问题,包括了vuejs父子组件通信的问题的使用技巧和注意事项,需要的朋友参考一下 父子组件之间可以通过props进行通信: 组件的定义: 1.创建component类:  2.注册一个tagnme: 局部注册: 模板注意事项:  因为 Vue 就是原生的DOM,所以有些自定义标签可能不符合DOM标准,比如想在 table 中自定义一个 tr,如果直接插入 my

  • 我有两个组件:父组件,我想改变子组件的状态: 和子组件: 我需要从父组件更改子组件的打开状态,或者当单击父组件中的按钮时,从父组件调用子组件的toggleMenu()?