当前位置:首页 > VUE

vue组件watch实现原理

2026-02-23 12:16:45VUE

Vue 组件 watch 实现原理

Vue 的 watch 机制基于响应式系统的依赖收集和触发更新机制。以下是其核心实现原理:

依赖收集与响应式系统

Vue 通过 Object.definePropertyProxy 实现数据劫持。当组件初始化时,watch 中定义的属性会被添加到依赖列表中。每次访问被监听的数据时,会触发 getter,将当前 watcher(监听器)添加到依赖中。

Watcher 类的核心逻辑

watch 的实现依赖于 Watcher 类。每个 watch 选项会创建一个 Watcher 实例,并在初始化时执行一次回调函数以收集依赖。当依赖的数据变化时,触发 setter,通知所有依赖的 Watcher 执行更新。

// 伪代码:Watcher 的核心逻辑
class Watcher {
  constructor(vm, expOrFn, callback) {
    this.vm = vm;
    this.getter = parsePath(expOrFn); // 解析属性路径
    this.callback = callback;
    this.value = this.get(); // 首次收集依赖
  }

  get() {
    pushTarget(this); // 将当前 Watcher 设置为全局正在计算的 Watcher
    const value = this.getter.call(this.vm, this.vm); // 触发 getter,收集依赖
    popTarget(); // 恢复之前的 Watcher
    return value;
  }

  update() {
    const oldValue = this.value;
    this.value = this.get(); // 重新获取值
    this.callback.call(this.vm, this.value, oldValue); // 执行回调
  }
}

深度监听与立即执行

  • 深度监听(deep):通过递归遍历对象的所有属性,为每个子属性绑定 Watcher,确保嵌套属性变化也能触发回调。
  • 立即执行(immediate):在 Watcher 初始化时直接调用回调函数,传入当前值。

异步更新队列

Vue 会将 Watcher 的更新操作推入异步队列(通过 nextTick 实现),避免频繁重复计算和渲染。多个数据变化会合并为一次更新。

vue组件watch实现原理

computed 的区别

  • watch 是主动监听,依赖变化时执行回调;computed 是惰性计算,仅在依赖变化且被访问时重新计算。
  • watch 适合处理异步或开销较大的操作;computed 适合派生状态。

总结

Vue 的 watch 通过响应式系统的依赖收集和 Watcher 机制实现。其核心是监听数据变化并执行回调,支持深度监听、立即执行等特性,同时利用异步队列优化性能。

标签: 组件原理
分享给朋友:

相关文章

vue实现原理

vue实现原理

Vue 实现原理 Vue.js 的核心实现原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是关键实现细节的分解: 响应式系统 Vue 2.x 使用 Object.defineProp…

vue实现绑卡的原理

vue实现绑卡的原理

Vue实现绑卡的原理 Vue实现绑卡功能通常涉及表单绑定、数据验证、API交互等核心环节。以下是关键实现原理和步骤: 数据双向绑定 使用v-model指令实现表单输入与Vue实例数据的双向绑定。例如…

vue watch 实现 原理

vue watch 实现 原理

Vue Watch 实现原理 Vue 的 watch 功能用于监听数据变化并执行回调函数。其核心原理基于 Vue 的响应式系统,依赖 Object.defineProperty 或 Proxy(Vue…

vue eventbus实现原理

vue eventbus实现原理

Vue EventBus 的实现原理 EventBus 是 Vue 中用于跨组件通信的一种模式,通常基于 Vue 的实例事件系统实现。其核心原理是通过一个独立的 Vue 实例作为事件中心,实现组件间的…

vue实现日历组件

vue实现日历组件

Vue 日历组件实现步骤 基础结构搭建 使用Vue 3的Composition API或Options API创建组件框架。核心结构包括年份/月份切换按钮、星期标题栏和日期网格。 <t…

vue实现分页组件

vue实现分页组件

Vue 分页组件实现 基础分页组件结构 创建一个名为 Pagination.vue 的文件,包含以下基础模板和逻辑: <template> <div class="pagina…