Vue.js 关注深度属性

Vue.js watching deep properties

我正在尝试查看 vue.js 对象的属性,但没有得到我想要的结果,我的代码如下:

var vueTable = new Vue({
    el: '#vue-table',
    data: {
        filters: {},
    },
    watch: {
        filters: {
            handler: function () {
                console.log('watched');
            },
            deep: true
        }
    }
}

我在输入上有一个 v-model,如下所示:

<input class="form-control" v-model="filters.name">

现在,当页面加载时,它只会在控制台中记录 watched 一次,每当我更改输入时,它都不会记录任何内容。

然而,当我在 table 初始化之后放置 vueTable.filters = {name: 'something'}; 时,它会在每次更改时触发。

这是意外行为吗?还是我们必须定义我们所有的属性才能被监视?

文档涵盖了这个 here

Due to the limitations of modern JavaScript (and the abandonment of Object.observe), Vue cannot detect property addition or deletion.

通过从一个空对象开始并将 v-model 设置为 filters.name,您最终动态添加了一个 属性。在这种情况下,最好的方法是初始化数据中的 属性。它不必具有值。

data: {
    filters: { name: null },
}

你可以使用具有这种外观的东西

this.$set(this.filters, 'name', "")

使用 $set (如 https://vuejs.org/v2/guide/reactivity.html#Change-Detection-Caveats 中所述)将正确添加 observable

你可以把你的filter对象初始化在data属性放到createdVue lifecycle hook.

var vueTable = new Vue({
    el: '#vue-table',
    // If you attach filters at this point in time
    // the watcher will work normally.
    created: function () {
        this.$data.filters = {
            filter_one: null,
            filter_two: null
        };
    },
    data: {
        filters: null,
    },
    watch: {
        filters: {
            handler: function (newValue) {
                // Here you will get the entire filter object 
                // if some property changes.
                console.dir(newValue);
            },
            deep: true
        }
    }
}