当前位置:首页 > 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实现登出

实现Vue登出功能 登出功能通常涉及清除用户会话、令牌或本地存储的数据,并重定向到登录页面。以下是几种常见的实现方式: 清除用户令牌和状态 在Vuex的store中定义一个logout mutati…

vue 实现表单

vue 实现表单

Vue 表单实现方法 Vue.js 提供了多种方式实现表单,包括双向数据绑定、表单验证和动态表单生成。以下是常见的实现方法: 基础表单绑定 使用 v-model 指令实现表单元素与数据的双向绑定:…

vue多选实现

vue多选实现

Vue 多选实现方法 基础实现(v-model + multiple) 在 Vue 中实现多选可以通过 <select> 元素的 multiple 属性结合 v-model 完成。v-mo…

vue实现slot

vue实现slot

Vue 中的 Slot 实现方法 Vue 的 slot 是一种内容分发机制,允许父组件向子组件插入内容。以下是几种常见的 Slot 实现方式: 默认 Slot 子组件通过 <slot>…

vue实现筛选

vue实现筛选

实现筛选功能的基本思路 在Vue中实现筛选功能通常需要结合数据绑定、计算属性和方法。筛选的核心逻辑是根据用户输入的条件过滤原始数据列表,并动态更新显示结果。 数据准备 定义一个数组存储原始数据,另一…

vue实现影院

vue实现影院

Vue实现影院功能的基本思路 使用Vue框架开发影院功能需要结合前端组件化开发、状态管理以及后端API交互。以下是关键实现步骤: 影院页面布局设计 影院页面通常分为顶部导航栏、影院列表区域和底部导航…