Vue.js 观察深层属性

Posted

技术标签:

【中文标题】Vue.js 观察深层属性【英文标题】:Vue.js watching deep properties 【发布时间】:2017-11-29 08:07:05 【问题描述】:

我正在尝试查看 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,每当我更改输入时,它都不会记录任何内容。

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

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

【问题讨论】:

【参考方案1】:

文档涵盖了这个here。

由于现代 javascript 的局限性(以及放弃 Object.observe),Vue 无法检测到属性添加或删除。

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

data: 
    filters:  name: null ,

【讨论】:

那太可惜了,我想那就没什么可做的了:),非常感谢【参考方案2】:

你可以用这个样子的东西

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

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

【讨论】:

【参考方案3】:

您可以将filter 对象初始化在data 属性中放入created Vue 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
        
    

【讨论】:

以上是关于Vue.js 观察深层属性的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 观察数组内的嵌套属性

Vue.js:如何在组件初始化时触发观察器函数

使用 Vuex 在 Vue.js 中的计算属性上未从观察者更新数据变量

Vue:深层嵌套对象上的观察者会记录 oldVal 和 newVal 吗?

Vue.js系列之四计算属性和观察者

技术小知识——Vue.js—watch