当前位置:首页 > 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 实例。其主要职责包括:

  • 记录监听的目标属性(或表达式)。
  • 保存回调函数(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 会将 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 类管理监听逻辑,结合深度监听和异步更新队列优化性能。其核心流程为:

vue watch 实现 原理

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

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

相关文章

vue实现autocomplete

vue实现autocomplete

Vue 实现 Autocomplete 功能 Vue 中实现 Autocomplete(自动完成)功能可以通过自定义组件或使用现有库完成。以下是几种常见方法: 方法一:使用 Vue 原生实现 创建…

实现简易vue

实现简易vue

实现简易 Vue 的核心思路 Vue 的核心功能包括数据响应式、模板编译和虚拟 DOM。以下是一个简易实现方案,涵盖核心功能模块。 数据响应式系统 通过 Object.defineProperty…

vue能实现

vue能实现

Vue.js 是一个流行的前端框架,能够实现多种功能。以下是 Vue 能够实现的主要功能和特性: 响应式数据绑定 Vue 的核心特性之一是响应式数据绑定。通过数据驱动视图,当数据发生变化时,视图会自…

vue实现博客

vue实现博客

Vue 实现博客的基本步骤 使用 Vue.js 实现一个博客系统可以分为前端和后端两部分。以下是基于 Vue 的前端实现方案,后端可以选择 Node.js、Django 或其他框架。 项目初始化 使…

vue实现选人

vue实现选人

实现选人功能的基本思路 在Vue中实现选人功能通常涉及以下核心环节:数据绑定、用户交互处理、状态管理以及界面渲染。以下是具体实现方法: 数据准备与组件结构 创建包含人员信息的数组,通常从API获取或…

vue实现门户

vue实现门户

Vue 实现门户网站的关键步骤 搭建基础框架 使用 Vue CLI 或 Vite 初始化项目,安装 Vue Router 管理多页面路由。门户通常需要响应式布局,可引入 UI 库如 Element P…