当前位置:首页 > 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 的 watch 通过响应式系统和 Watcher 机制实现数据监听。其核心是依赖收集和派发更新,结合异步队列优化性能,并提供深度监听和立即执行等选项。

vue的wacth实现原理

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

相关文章

vue实现星星

vue实现星星

实现星星评分的Vue组件 使用Vue实现星星评分功能可以通过组件化方式完成,以下是一个完整的实现方案: 模板部分 <template> <div class="star-ra…

vue交互实现

vue交互实现

Vue 交互实现方法 Vue.js 提供了多种方式实现用户交互,包括事件处理、表单绑定、动态渲染等。以下是常见的交互实现方法: 事件处理 通过 v-on 或 @ 指令绑定事件,触发方法或直接执行表…

vue实现tag

vue实现tag

Vue 实现标签(Tag)功能 在 Vue 中实现标签(Tag)功能可以通过多种方式完成,以下是一些常见的方法和实现步骤: 使用动态组件和 v-for 通过 v-for 指令动态渲染标签列表,结合…

vue权限实现

vue权限实现

Vue 权限实现方案 基于路由的权限控制 通过路由守卫实现权限验证,在路由配置中添加meta字段标记权限要求。在router.beforeEach中检查用户权限与路由要求的匹配情况。 // rout…

vue实现cs

vue实现cs

Vue 实现 CS(Client-Side)渲染的常见方法 Vue.js 是一个用于构建用户界面的渐进式框架,默认采用客户端渲染(CSR)。以下是几种常见的实现方式: 使用 Vue CLI 创建项…

vue实现fullpage

vue实现fullpage

Vue 实现 FullPage 效果 在 Vue 中实现全屏滚动(FullPage)效果可以通过多种方式完成,以下是几种常见的方法: 使用现有库 vue-fullpage.js 安装 vue-ful…