当前位置:首页 > VUE

vue watch实现过程

2026-03-09 05:18:10VUE

Vue 的 watch 实现原理

Vue 的 watch 功能基于响应式系统,通过依赖收集和触发回调实现数据监听。以下是核心实现过程:

依赖收集阶段

在组件初始化时,watch 选项会被解析并注册为响应式数据的依赖。Vue 遍历 watch 配置的每个属性,为每个监听目标创建一个 Watcher 实例。这个 Watcher 会记录回调函数和可选的配置(如 deepimmediate)。

当首次访问被监听的属性时,触发 getter 方法,将当前 Watcher 添加到依赖列表(Dep 的 subs 数组)中,建立数据与观察者的关联。

回调触发阶段

当被监听的数据发生变化时,触发 setter 方法,通知所有订阅该数据的 Watcher 实例执行更新。Watcher 会调用注册的回调函数,传入新值和旧值。如果设置了 deep: true,Vue 会递归遍历对象的所有属性以收集深层依赖。

异步更新队列

默认情况下,watch 的回调会被推入异步更新队列(通过 nextTick 实现),确保多次数据变更合并为一次回调执行。设置 sync: true 可强制同步执行。

vue watch实现过程

代码示例

// 简单实现核心逻辑
class Dep {
  constructor() {
    this.subs = []
  }
  addSub(watcher) {
    this.subs.push(watcher)
  }
  notify() {
    this.subs.forEach(watcher => watcher.update())
  }
}

class Watcher {
  constructor(vm, exp, cb, options) {
    this.vm = vm
    this.getter = parsePath(exp)
    this.cb = cb
    this.value = this.get()
    if (options.immediate) {
      this.cb.call(vm, this.value)
    }
  }
  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)
  }
}

function defineReactive(obj, key) {
  const dep = new Dep()
  let val = obj[key]
  Object.defineProperty(obj, key, {
    get() {
      if (Dep.target) dep.addSub(Dep.target)
      return val
    },
    set(newVal) {
      if (newVal === val) return
      val = newVal
      dep.notify()
    }
  })
}

使用方式对比

选项式 API

watch: {
  'obj.property'(newVal, oldVal) {
    // 处理变化
  },
  arr: {
    handler: 'methodName',
    deep: true
  }
}

组合式 API

import { watch } from 'vue'

watch(
  () => state.someProp,
  (newVal, oldVal) => {
    // 回调逻辑
  },
  { immediate: true }
)

性能优化建议

对于复杂数据结构,避免不必要的深度监听。考虑使用计算属性预处理数据,减少回调触发频率。必要时使用 flush: 'post' 确保 DOM 更新后执行回调。

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

相关文章

vue 实现闪烁

vue 实现闪烁

Vue 实现闪烁效果的方法 方法一:使用 CSS 动画 在 Vue 组件中定义一个闪烁的 CSS 动画,通过绑定 class 或 style 来控制元素的闪烁效果。 <template>…

vue 实现关闭

vue 实现关闭

Vue 实现关闭功能的方法 在Vue中实现关闭功能通常涉及组件销毁、模态框隐藏或路由跳转等场景。以下是几种常见实现方式: 销毁当前组件 使用v-if或v-show控制组件显示/隐藏,适用于局部组件:…

vue实现图册

vue实现图册

Vue实现图册功能 在Vue中实现图册功能通常涉及图片展示、切换、缩放等交互效果。以下是常见的实现方法和关键代码示例: 基础图册组件结构 使用Vue单文件组件构建基础结构: <templat…

vue实现加减

vue实现加减

Vue 实现加减功能 在 Vue 中实现加减功能可以通过数据绑定和事件监听来完成。以下是一个简单的实现方法: 模板部分 <template> <div> <…

proxy实现vue

proxy实现vue

使用 Proxy 实现 Vue 响应式系统 Vue 3 的响应式系统基于 JavaScript 的 Proxy API,通过代理对象实现对属性的拦截和依赖追踪。以下是实现的核心逻辑: 创建响…

自己实现vue

自己实现vue

实现简易版 Vue.js 核心功能 要实现一个简易版 Vue.js,需要理解其核心功能:数据响应式、模板编译、依赖收集和虚拟 DOM。以下分模块实现关键功能。 数据响应式(Reactivity) 通…