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
属性放到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
对象的属性,但没有得到我想要的结果,我的代码如下:
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
属性放到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
}
}
}