【发布时间】:2022-10-04 16:39:50
【问题描述】:
我正在为 Vue 如何更新道具/子组件而苦苦挣扎。
假设以下组件:
<template>
<v-card>
<Modification v-model="newObject"></Modification>
<OtherComponent @close="resetObject"></OtherComponent>
</v-card>
</template>
<script>
import { MyClass } from "classes";
import Modification from "b";
import OtherComponent from "a";
export default {
name: "ShiftForm",
components: { OtherComponent, Modification },
props: {
existingObject: {
type: [MyClass, typeof undefined],
required: false,
default: undefined
}
},
data() {
return {
newObject: undefined
};
},
created() {
this.newObject =
this.existingObject !== undefined
? this.existingObject.clone()
: new MyClass();
},
methods: {
resetObject() {
this.newObject =
this.existingObject !== undefined
? this.existingObject.clone()
: new MyClass();
}
}
};
</script>
MyClass 是如何定义的:
export class MyClass {
constructor({ a= null, b=null} = {}) {
this.a = a;
this.b = b;
}
toPayload(){
return { a:this.a , b:this.b };
}
clone() {
return new MyClass(this.toPayload());
}
}
该组件接收MyClass 的现有类实例,将其克隆(clone => new MyClass(...))并将其传递给Modification 组件,该组件根据用户输入进行一些修改。到目前为止一切顺利,修改有效。然而,一旦customEvent 被触发并且resetObject 方法被调用,newObject 被重置,但Modification 组件不会被现在重置的newObject 更新 - 它仍然显示旧的、修改后的值。我还在Modification 组件内部检查了更新是否发生:它没有。
为什么会这样?我错过了一步吗?我不知道 Vue 特定的机制吗?
注意:我发现了这个blog,它提供了强制Modification组件更新的解决方案。现在,对我来说,成为“THE”解决方案似乎很奇怪。
提前致谢。
编辑:
添加包含 console.log(JSON.stringify(this.newObject)) 的计算属性会在每次更新 newObject 时触发。
还会在模板更新中添加<span> {{ newObject.a }} </span>。
这两个测试都让我相信这个变量不仅应该是反应性的,而且实际上是反应性的。
编辑2:
Modification 组件目前由 2 个输入组件组成。
它看起来像这样。
<template>
<v-card-text>
<ModifyA v-model="object.a" @input="handleInput" />
<ModifyB v-model="object.b" @input="handleInput" />
</v-card-text>
</template>
<script>
import { MyClass } from "classes";
import ModifyA from "...";
import ModifyB from "...";
export default {
name: "ShiftFormFields",
components: { ModifyA, ModifyB },
props: {
value: {
type: MyClass,
required: true
}
},
data() {
return { object: this.value };
},
methods: {
handleInput() {
this.$emit("input", this.object);
}
}
};
</script>
如果我尝试将 ModifyA 输入添加到组件中,而不是像这样的 Modification 组件
<template>
<v-card>
<ModifyA v-model="newObject.a"></Modification>
<OtherComponent @close="resetObject"></OtherComponent>
</v-card>
</template>
resetObject 还会重置 ModifyA 组件中显示的值。
【问题讨论】:
标签: javascript vue.js vue-reactivity