当前位置:首页 > VUE

vue watch 实现原理

2026-01-18 01:04:16VUE

Vue Watch 实现原理

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

依赖收集

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

// 简化版依赖收集逻辑
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 会递归遍历对象的所有属性,为每个子属性绑定同样的依赖收集逻辑。

vue watch 实现原理

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 项目中实现自动翻译功能可以通过多种方式完成,以下是几种常见的方法: 使用第三方翻译 API 注册并获取翻译 API 的密钥(如 Google Translat…

vue实现下拉刷新组件

vue实现下拉刷新组件

实现下拉刷新组件的核心思路 下拉刷新功能通常通过监听触摸事件、滚动位置和动画效果实现。Vue中可以利用自定义指令或封装组件完成,以下为两种常见实现方式。 基于自定义指令的实现 创建指令监听触摸事件,…

vue实现打印二维码

vue实现打印二维码

安装二维码生成库 使用 qrcode 或 vue-qrcode 库生成二维码。通过 npm 安装: npm install qrcode vue-qrcode 生成二维码 在 Vue 组…

vue评分实现

vue评分实现

Vue 评分组件实现方法 使用第三方库(如 Element UI) 安装 Element UI: npm install element-ui 引入并注册组件: import Vue from '…

vue怎么实现

vue怎么实现

Vue 实现方法 Vue 是一个流行的前端框架,用于构建用户界面。以下是几种常见的实现方法: 数据绑定 使用 v-model 指令实现双向数据绑定,适用于表单输入元素。 <input v-m…

vue实现曲线

vue实现曲线

Vue 实现曲线的方法 在 Vue 中实现曲线可以通过多种方式,包括使用 SVG、Canvas 或第三方库如 D3.js、ECharts 等。以下是几种常见的方法: 使用 SVG 绘制曲线 SVG…