当前位置:首页 > VUE

vue watch 实现 原理

2026-02-11 08:04:37VUE

Vue Watch 实现原理

Vue 的 watch 机制是基于响应式系统的核心功能之一,用于监听数据变化并执行回调函数。其实现原理主要依赖以下几个关键点:

依赖收集与触发

Vue 的响应式系统通过 Object.definePropertyProxy(Vue 3)劫持数据的访问和修改。当在 watch 中监听某个属性时,Vue 会将该属性的依赖(即 watcher 实例)添加到依赖列表中。

  • 初始化阶段:watch 选项会被解析,为每个监听属性创建一个 watcher 实例。
  • 数据访问时:触发 getter,将当前 watcher 添加到依赖列表中(Dep 类管理)。
  • 数据修改时:触发 setter,通知所有依赖的 watcher 执行更新。

Watcher 类

Watcher 是 Vue 内部用于管理依赖的核心类,watch 的每个监听项对应一个 watcher 实例。其主要职责包括:

vue watch 实现 原理

  • 记录监听的目标属性(或表达式)。
  • 保存回调函数(handler)及其配置(如 deepimmediate)。
  • 当目标属性变化时,调用回调函数。
// 伪代码:Watcher 的基本逻辑
class Watcher {
  constructor(vm, expOrFn, handler, options) {
    this.vm = vm;
    this.getter = parsePath(expOrFn); // 解析属性路径(如 'a.b.c')
    this.handler = handler;
    this.deep = !!options.deep;
    this.value = this.get(); // 首次触发依赖收集
  }

  get() {
    pushTarget(this); // 将当前 watcher 设为全局依赖
    const value = this.getter.call(this.vm, this.vm); // 触发属性的 getter
    if (this.deep) traverse(value); // 深度监听时递归遍历子属性
    popTarget(); // 恢复上一个 watcher
    return value;
  }

  update() {
    const oldValue = this.value;
    this.value = this.get(); // 重新获取值
    this.handler.call(this.vm, this.value, oldValue); // 执行回调
  }
}

深度监听(deep: true)

当配置 deep: true 时,Vue 会递归遍历监听对象的所有子属性,为每个子属性绑定相同的 watcher。这是通过递归调用 traverse 函数实现的:

function traverse(val) {
  if (typeof val !== 'object') return;
  for (const key in val) {
    traverse(val[key]); // 递归触发子属性的 getter
  }
}

立即执行(immediate: true)

若配置 immediate: true,Vue 会在 watcher 创建时立即执行一次回调函数,此时 oldValueundefined

vue watch 实现 原理

异步更新队列

Vue 会将 watcher 的更新推入异步队列(nextTick 机制),避免频繁触发重复更新。这是通过 queueWatcher 方法实现的:

function queueWatcher(watcher) {
  const id = watcher.id;
  if (!has[id]) {
    has[id] = true;
    queue.push(watcher);
    nextTick(flushQueue); // 异步执行所有 watcher 的更新
  }
}

总结

Vue 的 watch 实现依赖于响应式系统的依赖收集和触发机制,通过 Watcher 类管理监听逻辑,结合深度监听和异步更新队列优化性能。其核心流程为:

  1. 初始化时为每个监听属性创建 watcher
  2. 数据访问时收集依赖,数据修改时触发 watcher 更新。
  3. 通过 deepimmediate 配置扩展功能。

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

相关文章

vue卖座网实现

vue卖座网实现

Vue 卖座网实现 项目结构搭建 使用 Vue CLI 快速初始化项目,安装必要依赖如 Vue Router、Vuex、Axios。 创建核心目录结构:components(通用组件)、views(页…

vue实现用户信息表

vue实现用户信息表

Vue 实现用户信息表的方法 使用 Vue CLI 创建项目 安装 Vue CLI 并初始化项目: npm install -g @vue/cli vue create user-info-tabl…

vue实现a4打印模板

vue实现a4打印模板

使用Vue实现A4打印模板 在Vue中实现A4打印模板需要结合CSS的打印样式和Vue的模板渲染能力。以下是具体实现方法: 设置A4纸张尺寸 在CSS中定义A4纸张的标准尺寸(210mm × 29…

vue computed 实现

vue computed 实现

computed 的基本用法 在 Vue 中,computed 用于声明计算属性,这些属性基于响应式依赖进行缓存。只有当依赖发生变化时,计算属性才会重新计算。 new Vue({ data:…

vue列表实现

vue列表实现

Vue 列表实现方法 使用 v-for 指令 v-for 是 Vue 中用于渲染列表的核心指令,基于数据源动态生成 DOM 元素。语法格式为 item in items 或 (item, index)…

vue slot实现

vue slot实现

vue slot 的实现方法 在 Vue 中,slot 是一种内容分发机制,允许父组件向子组件传递模板内容。以下是几种常见的 slot 实现方式: 默认 slot 默认 slot 是最基础的 sl…