当前位置:首页 > VUE

vue watch实现原理

2026-02-17 16:45:40VUE

Vue watch 实现原理

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

响应式系统基础

Vue 通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现数据的响应式。当数据被访问时,会触发 getter 并收集依赖(Watcher 实例);当数据被修改时,会触发 setter 并通知依赖更新。

vue watch实现原理

Watcher 类的作用

每个 watch 选项会创建一个 Watcher 实例。Watcher 的核心功能包括:

vue watch实现原理

  • 在初始化时执行 getter 函数(通常是监听的数据的读取操作),触发依赖收集。
  • 当依赖的数据变化时,触发 update 方法,最终执行用户定义的回调函数。

深度监听的实现

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

// 简化版的 Watcher 实现示例
class Watcher {
  constructor(vm, expOrFn, cb, options) {
    this.vm = vm;
    this.cb = cb;
    this.deep = !!options.deep;
    this.deps = [];
    if (typeof expOrFn === 'function') {
      this.getter = expOrFn;
    } else {
      this.getter = parsePath(expOrFn); // 解析路径,如 'a.b.c'
    }
    this.value = this.get();
  }

  get() {
    pushTarget(this); // 标记当前 Watcher 为正在收集的依赖
    const value = this.getter.call(this.vm, this.vm);
    if (this.deep) {
      traverse(value); // 递归遍历对象
    }
    popTarget(); // 结束依赖收集
    return value;
  }

  update() {
    const oldValue = this.value;
    this.value = this.get();
    this.cb.call(this.vm, this.value, oldValue);
  }
}

异步更新队列

Vue 会将 Watcher 的更新推入异步队列(通过 nextTick 实现),避免频繁重复计算和 DOM 操作,提升性能。

与 computed 的区别

  • computed 是惰性求值,只有依赖变化且被访问时才重新计算。
  • watch 是主动监听,依赖变化时立即执行回调。

Vue 3 的改进

Vue 3 使用 Proxy 替代 Object.defineProperty,并引入 effectReactiveEffect 类替代 Watcher,但核心原理类似。

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

相关文章

vue 实现递归

vue 实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据,例如菜单、评论列表或文件目录。以下是实现递归组件的关键步骤: 定义递归组件 递归组件需要设置 name 属性,以便在模…

computed vue 实现

computed vue 实现

computed 在 Vue 中的基本用法 Vue 的 computed 属性用于声明依赖于其他数据的计算属性。当依赖的数据变化时,计算属性会自动重新计算并缓存结果。 export defaul…

vue实现复选

vue实现复选

Vue 实现复选框 在 Vue 中实现复选框可以通过 v-model 指令绑定数据,同时结合 input 元素的 type="checkbox" 属性来实现。以下是几种常见的实现方式: 单个复选框…

vue实现增加

vue实现增加

实现 Vue 中的新增功能 在 Vue 中实现新增功能通常涉及数据绑定、表单处理和状态管理。以下是几种常见的实现方式: 数据绑定与列表渲染 通过 v-model 绑定表单输入,使用数组的 push…

mui实现vue

mui实现vue

mui 实现 Vue 的步骤 mui 是一个轻量级的前端框架,常用于移动端开发。结合 Vue 可以实现高效的开发体验。以下是具体实现方法。 安装 mui 和 Vue 通过 npm 或 yarn 安装…

vue实现前端录制

vue实现前端录制

Vue 实现前端录制功能 前端录制通常包括音频、视频或屏幕录制,结合Vue框架可以通过浏览器API实现。以下是几种常见录制场景的实现方法: 音频录制 使用浏览器MediaRecorder API实现…