当前位置:首页 > 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 3的实现方案: 数据结构设计 const timetableData = ref([ { ti…

用vue实现滑动输入条

用vue实现滑动输入条

使用 Vue 实现滑动输入条 使用原生 HTML5 input range 实现 在 Vue 模板中直接使用 <input type="range">,通过 v-model 绑定数据:…

vue实现图库

vue实现图库

Vue 实现图库的基本方法 使用 Vue 实现图库功能可以通过多种方式完成,以下是一些常见的方法和实现步骤。 使用 Vue 和第三方库(如 Vue Gallery) 安装 vue-gallery…

实现 vue 框架

实现 vue 框架

Vue 框架的基本实现 Vue 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是实现 Vue 框架的基本步骤和核心概念。 核心概念 响应式数据绑定 Vue 的核心特性之一是响应式数…

computed vue 实现

computed vue 实现

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

vue实现模块

vue实现模块

Vue 实现模块化的方法 Vue 支持多种模块化开发方式,可以根据项目需求选择适合的方案。 使用单文件组件(SFC) 单文件组件是 Vue 最常用的模块化方式,将模板、脚本和样式封装在一个 .vue…