Typescript 强制vue.js刷新道具时';的子属性已更改
我有一个绑定到对象上的组件,父组件更改其对象的属性。子组件应该对更改作出反应 子组件:Typescript 强制vue.js刷新道具时';的子属性已更改,typescript,vue.js,Typescript,Vue.js,我有一个绑定到对象上的组件,父组件更改其对象的属性。子组件应该对更改作出反应 子组件: import { Component, Emit, Inject, Model, Prop, Provide, Vue, Watch } from 'vue-property-decorator' @Component({ props: { value: Object, } }) class ValidatedSummaryComponent extends Vue {
import { Component, Emit, Inject, Model, Prop, Provide, Vue, Watch } from 'vue-property-decorator'
@Component({
props: {
value: Object,
}
})
class ValidatedSummaryComponent extends Vue {
value: any;
field = "Name";
v: any;
created() {
console.log("!", this.value);
this.v = this.value;
}
state: string | null = null;
error = "";
@Watch('value')
onValueChanged(val: any, oldVal: any) {
console.log("Value called", val);
this.v = val;
this.onChanged();
this.$forceUpdate();
}
private onChanged() {
if (typeof this.v.validationErrors[this.field] == 'undefined') {
this.state = null;
this.error = "";
} else {
this.state = 'invalid';
this.error = this.v.validationErrors[this.field].join();
}
}
}
export default ValidatedSummaryComponent;
用法:
<ValidatedSummary v-bind:value="bindableObject"></ValidatedSummary>
我需要我的组件ValidatedSummaryComponent
做出反应
我可能可以将其作为单独的属性进行绑定:
,但是在最终设计中,组件应该注意BindableObject
的所有属性,并且会有一些不同的BindableObjects
具有不同的属性集,因此我不能只按属性绑定它。
我设法使其工作的唯一方法是强制vue.js更新整个对象,确保vue.js平等性检查不通过:
this.bindableObject = Object.assign(new BindableObject(), this.bindableObject );
但这是非常麻烦的,因为我将不得不这样做的每一个变化,所以我正在寻找一个更好的方式来处理这个问题。
删除
this.$forceUpdate()代码>在上面的代码中,但我可以用它生存。好吧,只需执行强制更新。这会让你的生活更轻松
vm.$forceUpdate();
如文件中所述
强制Vue实例重新渲染。请注意,它不会影响所有项目
子组件,仅实例本身和具有
插入的插槽内容
但是,只有当您没有其他选项(仅作为最后一个选项)时,才建议使用此选项
那么,您还可以使用哪些其他选项使其工作。(取决于代码设计)
尝试使用Vue.set()。或者
重新分配已更改的对象
将我的评论转换为答案
您可以尝试使用watch
的deep
选项,如@MartinBean中所示,我知道这一点。该对象在子组件之外被完全观察并完全发挥功能。您可以尝试使用watch
的deep
选项,如手册@IVOGELOV Wow!所示!这正是我想要的。如果你可以把它作为一个答案-我会接受iTunes的,这并不总是导致更新,也没有帮助我在我的情况下。我有a)一个具有props的组件b)深度依赖性c)设置为props的实体通过vuejs相等性检查,这也会阻止它刷新。不确定这三个或全部中的哪一个,但这就是造成我问题的原因
vm.$forceUpdate();