1. vue2 使用watch 深度监听一个值
在 Vue 2 中,如果你想深度监听一个对象或数组的属性变化,你可以使用 deep
选项来实现。
这通常用于当你的响应式数据是一个复杂的数据结构(如对象或数组)时,并且你希望在这些数据结构内部发生变化时也能触发监听器。
下面是如何在 Vue 2 中设置一个深度监听的 watch
示例:
1.1. 基本用法
首先,你需要定义一个响应式的对象或数组,在 Vue 实例的 data
属性中声明它:
export default { data() { return { myObject: { innerValue: 0, }, }; }, };
然后,在 watch
对象中设置一个观察器,指定 deep
为 true
:
export default { data() { return { myObject: { innerValue: 0, }, }; }, watch: { myObject: { handler(newValue, oldValue) { console.log('myObject changed:', newValue, oldValue); }, deep: true, // 这里启用深度监听 }, }, };
1.2. 注意事项
性能影响:深度监听可能会导致性能问题,因为它会递归地监听所有嵌套的属性。如果你知道只有某些特定的属性会改变,考虑只监听那些特定的属性。
数组变更检测:Vue.js 通过对象属性的变动来检测变化,但对数组的变更检测有一些限制。对于数组,只有使用变异方法(如
push
,splice
等)才会被检测到。如果直接修改索引或长度,需要手动调用$set
或$delete
方法。
1.3. 示例代码
这里有一个完整的示例,展示了如何在 Vue 2 中使用深度监听:
new Vue({ el: '#app', data: { myObject: { innerValue: 0, }, }, watch: { myObject: { handler(newValue, oldValue) { console.log('myObject changed:', newValue, oldValue); }, deep: true, }, }, });
HTML:
<div id="app"> <button @click="myObject.innerValue += 1">Increment</button> <p>Current value: {{ myObject.innerValue }}</p> </div>
在这个例子中,每次点击按钮都会更新 innerValue
的值,并且由于我们启用了深度监听,所以 watch
的 handler
函数会被调用。