子组件修改父组件的问题,求助大佬
这里说法是不是矛盾的,是我理解能力不够吗?测试代码,也是,父组件修改子组件能刷新,子组件修改父组件没反应,那个大佬能帮我看看是不是我代码有问题,还是文档有问题:
@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 技术问答马拉松,欢迎正在阅读的你也加入。
在编程中,通常子组件不应该直接修改父组件的状态或属性。这是因为子组件应该是被动的,只负责显示父组件传递下来的数据,并且响应父组件的状态变化。如果子组件需要修改父组件的状态,通常应该通过事件或回调函数的方式通知父组件,由父组件自己决定如何修改状态。
在你提供的代码中,ViewA
组件试图直接修改 ClassA
实例的 value
属性,而 ClassA
实例是通过 ObjectLink
传递给 ViewA
的。然而,由于 ClassA
使用了 @Observed
装饰器,它的状态变化应该是可以观察的,这意味着当 value
属性变化时,相关的界面应该会刷新。
不过,在 ViewB
组件中,ClassA
的实例是作为 ClassC
的属性间接传递给 ViewA
的。这意味着当你试图通过 ViewA
的按钮来修改 ClassA
的 value
属性时,ViewB
组件可能无法观察到这个变化,因为 ViewB
只直接观察了 ClassC
的状态,而没有观察 ClassC
内部属性的变化。
为了解决这个问题,你可以尝试以下几种方法:
ViewA
在 value
属性变化时发出一个事件或调用一个回调函数,通知 ViewB
更新其显示。ClassC
和 ClassB
的状态也是可观察的,这样当 ClassA
的 value
属性变化时,ViewB
可以观察到 ClassC
和 ClassB
的状态变化。另外,请确保你正在使用的框架或库(在这个情况下是 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()?