vue2响应式的$watch
时间: 2025-01-08 18:10:14 浏览: 48
### Vue2 中 `$watch` 的使用方法
在 Vue 实例中,可以利用 `this.$watch()` 方法来监听特定的数据属性或计算属性的变化。此函数接收三个参数:
- **expOrFn**: 被观察的对象表达式或者是返回对象的回调函数。
- **callback**: 当被监视的目标发生改变时调用该回调函数。
- **options (可选)**: 配置选项,比如设置 `{immediate:true}` 可让回调立即执行一次。
具体例子如下所示[^1]:
```javascript
new Vue({
el: '#demo',
data () {
return {
message: 'Hello'
}
},
mounted () {
this.$watch('message', function(newValue, oldValue){
console.log(`新值:${newValue},旧值:${oldValue}`);
});
}
});
```
上述代码展示了如何通过 `mounted` 生命周期钩子启动对 `message` 属性变化的监控,并打印其更新前后的值。
对于更复杂的场景,则可以通过传递配置项来自定义行为,例如立即触发侦听器或是深度监测数组/对象内部变动等情形[^3]:
```javascript
this.$watch(
'someObject.nestedProperty',
{
handler(newVal) {
console.log(`Nested property changed to ${newVal}`)
},
deep: true,
immediate: true
}
);
```
这段代码说明了当嵌套结构中的某个深层路径发生变化时应该如何做出反应;同时启用了即时运行以及深层检测功能。
### Vue2 中 `$watch` 的实现原理
Vue 的核心特性之一就是它的响应式机制,而 `$watch` 正是基于这套体系构建起来的功能模块。每当创建一个新的 watcher 对象时,它会被注册到依赖收集系统 Dep 上面去,在后续目标变量变更的时候就能通知对应的 watcher 执行相应的逻辑操作[^4]。
简单来说,整个过程涉及到了几个重要概念和技术点:
- **Watcher 类**:负责管理视图渲染过程中产生的副作用(即用户自定义的操作),并将其与 DOM 更新关联在一起;
- **Dep 类**:用来存储所有的 Watcher 实例列表,以便于能够及时向这些订阅者发送消息告知数据状态已更改的事实;
- **defineReactive 函数**:这是使 JavaScript 对象变得具有响应性的关键所在,通过对 Object.defineProperty 或 ES6 Proxy 进行封装实现了双向绑定的效果。
最后一步则是将当前上下文中新建出来的 watcher 添加至全局共享队列之中等待调度执行[^5]。
阅读全文
相关推荐















