当前位置:首页 > VUE

vue watch 实现原理

2026-01-18 01:04:16VUE

Vue Watch 实现原理

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

vue watch 实现原理

依赖收集

在 Vue 的响应式系统中,每个被监听的数据属性会被转换为 gettersetter。当初始化 watch 时,Vue 会执行一次 getter 函数,触发依赖收集,将当前 watcher 实例添加到该属性的依赖列表中。

vue watch 实现原理

// 简化版依赖收集逻辑
function defineReactive(obj, key) {
  let value = obj[key]
  const dep = new Dep() // 依赖管理器

  Object.defineProperty(obj, key, {
    get() {
      if (Dep.target) { // 当前正在计算的watcher
        dep.addSub(Dep.target)
      }
      return value
    },
    set(newVal) {
      if (newVal === value) return
      value = newVal
      dep.notify() // 通知所有依赖更新
    }
  })
}

Watcher 类

watch 的实现依赖于 Watcher 类。每个 watch 选项会创建一个 Watcher 实例,该实例会在数据变化时触发回调。

class Watcher {
  constructor(vm, expOrFn, cb) {
    this.vm = vm
    this.cb = cb
    this.getter = parsePath(expOrFn) // 解析属性路径
    this.value = this.get() // 触发依赖收集
  }

  get() {
    Dep.target = this
    const value = this.getter.call(this.vm, this.vm)
    Dep.target = null
    return value
  }

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

监听触发流程

  1. 初始化 watch 时,创建一个 Watcher 实例,并立即执行一次 get 方法,触发属性的 getter,完成依赖收集。
  2. 当监听的属性被修改时,触发 setter,调用 dep.notify() 通知所有依赖的 watcher 执行 update 方法。
  3. update 方法中获取新值,并调用用户定义的回调函数。

深度监听实现

对于 deep: true 的深度监听,Vue 会递归遍历对象的所有属性,为每个子属性绑定同样的依赖收集逻辑。

function traverse(value) {
  if (typeof value !== 'object') return
  for (const key in value) {
    traverse(value[key]) // 递归触发getter
  }
}

立即触发与异步队列

  • immediate: true 时,会在 watch 创建后立即执行回调。
  • 默认情况下,回调会被推入异步队列,确保多次数据变更合并为一次回调执行。

与 computed 的区别

  • watch 是主动监听,适合数据变化时执行异步或开销较大的操作。
  • computed 是惰性求值,基于其依赖的响应式数据缓存计算结果。

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

相关文章

vue实现发表

vue实现发表

Vue 实现发表功能 在 Vue 中实现发表功能通常涉及表单处理、数据绑定和网络请求。以下是实现步骤和代码示例: 表单设计与数据绑定 创建一个表单用于输入发表内容,使用 v-model 进行数据双向…

vue实现颜色

vue实现颜色

Vue 实现颜色的方法 在 Vue 中实现颜色管理可以通过多种方式,以下是一些常见的方法: 使用 CSS 变量动态绑定颜色 在 Vue 组件的样式中定义 CSS 变量,并通过 Vue 的数据绑定动态…

vue ref实现

vue ref实现

Vue 中 ref 的实现 在 Vue 中,ref 是一个用于创建响应式引用的 API,适用于基本类型和对象。以下是 ref 的核心实现原理和使用方法。 基本实现原理 ref 通过 Reactive…

vue实现dag

vue实现dag

Vue实现DAG(有向无环图) 在Vue中实现DAG(Directed Acyclic Graph,有向无环图)通常涉及数据结构的建模、可视化渲染以及交互逻辑处理。以下是关键实现步骤和示例代码: 数…

vue实现vr

vue实现vr

Vue 实现 VR 的方法 Vue 可以与 WebVR 或 WebXR API 结合使用,通过 Three.js、A-Frame 等库实现 VR 效果。以下是几种常见方法: 使用 A-Frame 框…

vue app 实现

vue app 实现

Vue App 实现步骤 创建Vue项目 使用Vue CLI或Vite初始化项目。Vue CLI适合传统项目,Vite适合现代轻量级应用。 npm create vue@latest my-vu…