当前位置:首页 > VUE

vue的wacth实现原理

2026-02-24 04:43:50VUE

Vue 的 watch 实现原理

Vue 的 watch 功能用于监听数据变化并执行回调函数。其核心实现依赖于 Vue 的响应式系统和依赖收集机制。

响应式系统基础

Vue 通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现数据劫持。当数据被访问时,会触发 getter 进行依赖收集;当数据被修改时,会触发 setter 通知依赖更新。

Watcher 类的角色

watch 的核心是 Watcher 类,它是一个观察者,负责订阅数据变化并执行回调。每个 watch 选项会创建一个 Watcher 实例。

  • 依赖收集Watcher 在初始化时会执行一次 getter 函数(通常是监听的数据的读取操作),触发数据的 getter,从而将当前 Watcher 添加到依赖列表中。
  • 派发更新:当数据变化时,setter 会通知所有依赖的 Watcher,触发 update 方法,最终执行回调函数。

深度监听实现

当设置 deep: true 时,Watcher 会递归遍历监听对象的所有属性,为每个子属性收集依赖。这样,任何嵌套属性的变化都会触发回调。

立即执行选项

如果设置 immediate: trueWatcher 会在创建时立即执行一次回调函数,无需等待数据变化。

异步更新策略

Vue 通过异步队列(nextTick)批量处理 Watcher 更新,避免频繁触发回调。多个数据变化会被合并到一次更新中。

源码关键逻辑(简化)

以下是 Vue 2 中 Watcher 的核心逻辑简化:

class Watcher {
  constructor(vm, expOrFn, cb, options) {
    this.vm = vm;
    this.cb = cb;
    this.deep = !!options.deep;
    this.getter = parsePath(expOrFn); // 解析路径,返回一个函数
    this.value = this.get(); // 首次收集依赖
  }

  get() {
    pushTarget(this); // 将当前 Watcher 设置为全局的依赖目标
    const value = this.getter.call(this.vm, this.vm); // 触发数据的 getter
    if (this.deep) traverse(value); // 深度监听时递归遍历
    popTarget(); // 恢复之前的依赖目标
    return value;
  }

  update() {
    queueWatcher(this); // 将 Watcher 加入异步队列
  }

  run() {
    const newValue = this.get();
    const oldValue = this.value;
    this.value = newValue;
    this.cb.call(this.vm, newValue, oldValue); // 执行回调
  }
}

Vue 3 的变化

Vue 3 改用 Proxy 实现响应式,但 watch 的核心逻辑类似。watch API 通过 effectscheduler 实现,底层仍依赖依赖收集和派发更新机制。

vue的wacth实现原理

总结

Vue 的 watch 通过响应式系统和 Watcher 机制实现数据监听。其核心是依赖收集和派发更新,结合异步队列优化性能,并提供深度监听和立即执行等选项。

标签: 原理vue
分享给朋友:

相关文章

vue实现gps

vue实现gps

Vue 中实现 GPS 定位功能 在 Vue 中实现 GPS 定位功能通常依赖于浏览器的 Geolocation API 或第三方地图服务(如高德、百度地图等)。以下是两种常见的实现方式: 使用浏览…

vue 实现滑动

vue 实现滑动

Vue 实现滑动效果的方法 在Vue中实现滑动效果可以通过多种方式,以下是几种常见的方法: 使用CSS过渡和动画 通过Vue的<transition>组件结合CSS过渡或动画实现滑动效果…

vue实现系统

vue实现系统

Vue 实现系统的核心方法 使用 Vue.js 构建系统时,需结合其响应式特性与组件化开发模式。以下为关键实现路径: 项目初始化与工程配置 通过 Vue CLI 或 Vite 创建项目骨架,推荐选择…

vue 实现聊天

vue 实现聊天

使用 Vue 实现聊天功能 创建 Vue 项目并安装依赖 确保已安装 Vue CLI,通过以下命令创建新项目: vue create chat-app 进入项目目录后,安装必要的依赖(如 Socke…

vue实现双击

vue实现双击

Vue 实现双击事件的方法 在Vue中实现双击事件可以通过以下几种方式完成,具体选择取决于项目需求和开发习惯。 使用 @dblclick 指令 Vue提供了内置的@dblclick指令,可以直接在模…

vue如何实现mvvm

vue如何实现mvvm

Vue 实现 MVVM 的核心机制 Vue 的 MVVM(Model-View-ViewModel)实现依赖于数据绑定和响应式系统,通过以下核心机制完成: 数据劫持(响应式系统) Vue 使用 Ob…