当前位置:首页 > VUE

vue watch实现过程

2026-03-29 16:52:44VUE

Vue 的 watch 实现过程

Vue 的 watch 功能是通过响应式系统的依赖收集和触发机制实现的。以下是其核心实现逻辑:

依赖收集阶段

在组件初始化时,Vue 会遍历 watch 选项中定义的每个侦听器。对于每个侦听器,Vue 会创建一个 Watcher 实例,并将侦听器的回调函数作为该 Watcher 的更新函数。

当首次求值侦听器的表达式(或函数)时,会触发响应式属性的 getter,从而将当前 Watcher 添加到该属性的依赖列表中。

vue watch实现过程

// 简化版 Watcher 构造过程
class Watcher {
  constructor(vm, expOrFn, callback) {
    this.vm = vm
    this.getter = parsePath(expOrFn)
    this.cb = callback
    this.value = this.get()
  }

  get() {
    pushTarget(this) // 设置当前运行的 Watcher
    const value = this.getter.call(this.vm, this.vm)
    popTarget() // 清除当前 Watcher
    return value
  }

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

触发更新阶段

当侦听的响应式属性发生变化时,会触发属性的 setter,进而通知所有依赖的 Watcher 执行更新。对于 watch 创建的 Watcher,会执行回调函数并传入新旧值。

Vue 内部使用异步队列来批量处理更新,通过 nextTick 确保所有变更完成后才执行回调。

vue watch实现过程

深度侦听实现

当配置 deep: true 时,Vue 会递归遍历侦听对象的所有属性,主动触发它们的 getter 来收集依赖:

function traverse(val) {
  if (typeof val !== 'object') return

  for (const key in val) {
    traverse(val[key]) // 递归访问所有属性
  }
}

立即调用实现

当配置 immediate: true 时,会在 Watcher 创建后立即执行回调:

if (options.immediate) {
  callback.call(vm, watcher.value, null)
}

性能优化

Vue 3 的 watch 基于 effectReactiveEffect 实现,原理类似但更高效,支持更灵活的清理机制和更好的组合式 API 集成。

标签: 过程vue
分享给朋友:

相关文章

vue 实现单选

vue 实现单选

使用 v-model 绑定单选值 在 Vue 中,可以通过 v-model 绑定单选按钮的值。定义一个响应式数据(如 selectedOption),并将其与单选按钮的 value 属性关联。…

vue 动画实现

vue 动画实现

Vue 动画实现方式 Vue 提供了多种方式实现动画效果,主要分为内置组件和第三方库集成。 使用 Vue 内置过渡组件 Vue 的 <transition> 和 <transiti…

vue实现list

vue实现list

Vue 实现列表渲染 在 Vue 中,可以使用 v-for 指令来渲染列表。v-for 指令基于一个数组或对象来渲染一个列表,可以遍历数组或对象的属性。 基本列表渲染 <template>…

vue 实现登录

vue 实现登录

Vue 实现登录功能 创建登录表单组件 在 Vue 项目中创建一个登录表单组件(如 Login.vue),包含用户名和密码输入框以及提交按钮。使用 v-model 实现双向数据绑定。 <tem…

vue实现网站

vue实现网站

Vue 实现网站的基本步骤 Vue.js 是一个渐进式 JavaScript 框架,适合构建现代化的单页应用(SPA)或动态网站。以下是使用 Vue 实现网站的基本方法。 初始化 Vue 项目 使用…

vue实现login

vue实现login

Vue 实现登录功能 在 Vue 中实现登录功能通常需要以下几个步骤: 创建登录表单组件 在 Vue 项目中创建一个登录表单组件,包含用户名和密码输入框以及提交按钮。可以使用 Vue 的模板语法和双…