当前位置:首页 > VUE

vue watch实现原理

2026-03-29 16:51:08VUE

Vue watch 的实现原理

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

vue watch实现原理

依赖收集与响应式系统

Vue 通过 Object.definePropertyProxy 拦截数据的读写操作。在初始化 watch 时,会执行一次回调函数或读取被监听的值,触发属性的 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 实例,负责执行回调函数。当依赖的数据变化时,Watcher 会被通知并重新求值。

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

  get() {
    Dep.target = this // 标记当前watcher
    const value = this.getter.call(this.vm, this.vm)
    Dep.target = null // 收集完成后清除标记
    return value
  }

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

深层监听与立即触发

  • 深层监听(deep):递归遍历对象的所有属性,强制触发它们的 getter 以收集依赖。
  • 立即触发(immediate):在 Watcher 创建时直接调用一次回调函数。
if (this.deep) {
  traverse(value) // 递归遍历对象
}
if (this.immediate) {
  callback.call(vm, value, null)
}

异步更新队列

Vue 会将触发的 watcher 推入队列,在下一个事件循环中统一执行,避免重复计算和频繁更新。

function queueWatcher(watcher) {
  nextTick(flushSchedulerQueue)
}

总结

Vue 的 watch 通过响应式系统追踪依赖,在数据变化时通过 Watcher 机制调度回调。其核心在于依赖收集、派发更新和异步批量处理,实现了高效的数据监听。

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

相关文章

vue实现markdown

vue实现markdown

Vue 实现 Markdown 编辑器 在 Vue 中实现 Markdown 编辑器可以通过集成第三方库或自定义解析器完成。以下是两种常见方法: 使用第三方库(如 marked 或 markdown…

甘特图vue实现

甘特图vue实现

甘特图 Vue 实现方法 使用开源库 vue-ganttastic 安装依赖: npm install vue-ganttastic 基础实现代码: <template> <…

vue实现 单选

vue实现 单选

实现 Vue 单选功能 在 Vue 中实现单选功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-model 绑定单选按钮 通过 v-model 可以轻松实现单选功能,将单选按钮的值绑定到同…

vue实现123456

vue实现123456

Vue 实现数字 123456 的显示 在 Vue 中显示数字 123456 非常简单,可以通过以下方法实现: 方法一:直接在模板中显示 <template> <div>…

vue实现多选

vue实现多选

Vue 实现多选功能 在 Vue 中实现多选功能可以通过多种方式完成,以下是常见的几种方法: 使用 v-model 绑定数组 通过 v-model 绑定到一个数组,可以实现多选功能。适用于复选框组(…

vue网页实现

vue网页实现

Vue 网页实现指南 环境准备 安装 Node.js 和 npm/yarn,确保环境配置正确。使用 Vue CLI 或 Vite 创建项目框架,快速搭建开发环境。 npm install -g @v…