代码之家  ›  专栏  ›  技术社区  ›  Archeg

更改子属性时强制vue.js刷新属性

  •  0
  • Archeg  · 技术社区  · 8 年前

    我有一个绑定在对象上的组件,父组件更改其对象的属性。子组件应该对更改做出反应。

    子组件:

    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>
    

    然后我会:

    bindableObject.Name = 'New name' 
    

    我需要我的组件 ValidatedSummaryComponent 做出反应。

    我可以把它作为一个单独的属性绑定:

    <ValidatedSummary v-bind:value="bindableObject.Name"></ValidatedSummary>

    ,但是 在最终设计中,组件应该注意 BindableObject 会有一些不同的 BindableObjects 有不同的属性集,所以我不能一个属性一个属性地绑定它。

    我设法使其工作的唯一方法是强制vue.js更新整个对象,以确保vue.js相等检查不通过:

    this.bindableObject = Object.assign(new BindableObject(), this.bindableObject );
    

    但这是非常麻烦的,因为我将不得不这样做的每一个变化,所以我正在寻找一个更好的方式来处理这一点。 把它移走也不错 this.$forceUpdate(); 在上面的代码中,但我可以存活下来。

    2 回复  |  直到 8 年前
        1
  •  0
  •   IVO GELOV    8 年前

    把我的评论转化为回答。

    您可以尝试使用 deep 选择 watch 如所示 manual

        2
  •  0
  •   Ankit Kumar Ojha    8 年前

    那就做一个部队更新。它会让你的生活更轻松

    vm.$forceUpdate();
    

    如文件所述

    强制Vue实例重新呈现。注意这并不影响所有人 子组件,只有实例本身和具有 插入的插槽内容。

    但是,只有当您没有其他选项(仅作为最后一个选项)时,才建议使用此选项。

    所以你还可以使用其他什么选项来让它工作。

    1. 尝试使用vue.set()。或者,
    2. 重新分配更改的对象。
    推荐文章