在Vue中,computed是我们常用的一个模块,它可以根据所监听的数据自动计算出结果,而不需要手动调用函数计算。当依赖的数据发生变化时,computed会重新计算,这样我们就可以方便地处理数据的变化。
在Vue中,computed默认只会对其直接依赖的数据进行浅监听,在依赖的数据发生改变时才会重新计算。但是,当我们希望在依赖数据的嵌套对象中某个属性值改变时也触发computed重新计算,这时我们需要使用deep属性。将deep属性设置为true,就可以进行深层监听了。
Vue.component('example', { props: ['obj'], computed: { deepObj: { // 开启深度监听 deep: true, // 计算属性 get: function() { return this.obj; }, set: function(val) { this.$emit('update:obj', val); } } } });
上面的代码中,我们创建了一个组件,在组件的computed属性中创建了一个deepObj的计算属性。该计算属性监听了props传来的obj,开启了深度监听。当obj的值发生变化时,深度监听可以监听到内部属性值的变化,并触发computed的重新计算。
在Vue中,使用深度监听需要注意的是,由于它需要深入嵌套对象中去监听内部属性,因此每一次数据的变化都会触发重新计算,对于性能的消耗是很大的。在使用深度监听时需要注意对数据结构的优化,尽可能地减少对象层数,避免不必要的数据变化,从而提升应用的性能。
var vm = new Vue({ data: { obj: { a: { b: { c: 1 } } } }, computed: { // 使用deep深度监听 deepObj: { deep: true, get: function() { return this.obj; } } } }); vm.deepObj.a.b = {c:2};
在上面的代码中,我们初始化了一个Vue实例,该实例数据中包含一个嵌套对象。通过给computed所监听的数据开启深度监听,我们可以监听到嵌套对象中c属性值的变化。在修改b属性值时,由于我们开启了深度监听,因此computed重新计算,并将新的对象返回到deepObj中。
在Vue中,我们可以随时开启和关闭深度监听,只需要在computed属性中添加或移除deep属性即可。同时,我们可以使用watcher来完成更为复杂的监听,实现我们在Vue应用中所需要的各种效果。