当前位置:首页 > VUE

vue watch 实现原理

2026-03-10 06:48:44VUE

Vue 中 watch 的实现原理

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

响应式系统基础

Vue 通过 Object.definePropertyProxy(Vue 3)实现数据劫持。当数据被访问时,依赖会被收集到当前执行的 Watcher 中;当数据变更时,触发依赖通知所有关联的 Watcher 执行更新。

vue watch 实现原理

Watcher 类的角色

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

vue watch 实现原理

  • 记录回调函数和监听的表达式(如 data 的属性路径)。
  • 通过 getter 主动求值,触发依赖收集。
  • 在数据变化时调用回调函数。
// 简化版 Watcher 示例
class Watcher {
  constructor(vm, expOrFn, callback) {
    this.vm = vm;
    this.getter = parsePath(expOrFn); // 解析属性路径(如 'a.b.c')
    this.callback = callback;
    this.value = this.get(); // 初始求值,触发依赖收集
  }

  get() {
    Dep.target = this; // 标记当前 Watcher
    const value = this.getter.call(this.vm, this.vm); // 求值,触发数据劫持的 getter
    Dep.target = null; // 收集完成后清除标记
    return value;
  }

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

依赖收集与触发流程

  1. 依赖收集:初始化 Watcher 时调用 get(),访问监听的数据属性,触发属性的 getter,将当前 Watcher 添加到属性的依赖列表(Dep 中)。
  2. 触发更新:当数据被修改时,触发 setter,通知 Dep 中所有 Watcher 执行 update(),最终调用回调函数。

深度监听的实现

当设置 deep: true 时,Watcher 会递归遍历监听对象的所有子属性,强制触发它们的 getter,从而收集深层依赖:

if (this.deep) {
  traverse(value); // 递归遍历对象/数组
}

异步更新队列

默认情况下,Vue 会将 Watcher 的更新推入异步队列(nextTick 机制),避免重复计算和频繁 DOM 操作。可通过 sync: true 强制同步执行。

与计算属性的区别

  • 计算属性:基于依赖缓存,只有依赖变化时才重新计算,适用于派生数据。
  • 侦听器:无缓存,每次变化都执行回调,适合异步或开销较大的操作。

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

相关文章

vue实现语音

vue实现语音

Vue 实现语音功能的方法 使用 Web Speech API Vue 可以结合 Web Speech API 实现语音识别和合成功能。Web Speech API 包含 SpeechRecognit…

vue实现遮罩

vue实现遮罩

Vue 实现遮罩层的方法 在 Vue 中实现遮罩层可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 v-show 或 v-if 控制显示 通过 Vue 的指令动态控制遮罩层的显示与隐藏。…

vue实现hover

vue实现hover

Vue 实现 hover 效果的方法 在 Vue 中实现 hover 效果可以通过多种方式实现,包括使用 CSS、Vue 指令或事件监听。以下是几种常见的方法: 使用 CSS :hover 伪类 通…

利用vue 实现

利用vue 实现

以下是利用 Vue 实现常见功能的几种方法,分为不同场景和技术要点: 数据绑定与响应式更新 Vue 的核心特性是数据绑定,通过 v-model 实现双向绑定: <template>…

vue实现选人

vue实现选人

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

vue for实现

vue for实现

Vue 中的 v-for 指令 v-for 是 Vue.js 中用于渲染列表数据的核心指令,通过遍历数组或对象生成动态内容。 基本语法(数组) <ul> <li v-for…