当前位置:首页 > VUE

vue组件watch实现原理

2026-01-22 21:32:27VUE

Vue 组件 watch 实现原理

Vue 的 watch 功能用于监听数据变化并执行回调函数。其核心原理基于 Vue 的响应式系统和依赖收集机制。

响应式系统基础

Vue 通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现数据劫持。当数据被访问时,依赖会被收集;当数据被修改时,依赖会被通知并触发更新。

vue组件watch实现原理

watch 的工作流程

  1. 初始化监听
    在组件初始化阶段,Vue 会遍历 watch 选项中定义的属性,为每个属性创建一个 Watcher 实例。这个 Watcher 会记录回调函数和监听的目标路径。

  2. 依赖收集
    当首次执行 watch 时,会读取被监听属性的值,触发其 getter。此时,Watcher 会被添加到该属性的依赖列表中(即 Dep 实例的订阅者列表)。

    vue组件watch实现原理

  3. 触发回调
    当被监听的属性值发生变化时,会触发 setter,通知所有订阅该属性的 Watcher 执行更新。Watcher 会执行回调函数,并传入新值和旧值。

源码关键逻辑(Vue 2 示例)

// 简化版 Watcher 实现
class Watcher {
  constructor(vm, expOrFn, cb, options) {
    this.vm = vm;
    this.cb = cb;
    this.getter = parsePath(expOrFn); // 解析属性路径(如 'a.b.c')
    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.cb.call(this.vm, this.value, oldValue); // 执行回调
  }
}

深层监听与立即执行

  • deep: true
    递归遍历监听对象的所有子属性,为每个子属性绑定同样的依赖收集逻辑。
  • immediate: true
    在初始化时立即执行一次回调,此时旧值为 undefined

Vue 3 的优化

Vue 3 改用 Proxy 实现响应式,watch 通过 effectReactiveEffect 实现类似的依赖追踪,逻辑更简洁且性能更好。

注意事项

  • 避免在回调中修改监听的数据,可能导致无限循环。
  • 对于复杂对象,使用 deep 监听可能带来性能开销,建议明确指定需要监听的子属性。

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

相关文章

css动画制作原理

css动画制作原理

CSS动画制作原理 CSS动画通过关键帧(@keyframes)和动画属性(如animation-name、animation-duration)实现动态效果。核心原理分为两部分:定义动画关键帧和绑定…

vue实现原理

vue实现原理

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

vue动态组建实现原理

vue动态组建实现原理

Vue动态组件的实现原理 Vue的动态组件主要通过<component>标签和is属性实现,其核心原理涉及以下机制: 动态组件基础语法 <component :is="curre…

vue实现下拉刷新组件

vue实现下拉刷新组件

Vue 下拉刷新组件实现 核心思路 通过监听 touch 事件计算滑动距离,结合 CSS 过渡动画实现下拉效果,触发刷新回调。 基础实现步骤 监听 touch 事件 在组件 mounted 阶段…

vue组件实现

vue组件实现

Vue 组件实现 Vue 组件是 Vue.js 的核心特性之一,允许开发者将 UI 拆分为独立、可复用的模块。以下是实现 Vue 组件的几种常见方式: 单文件组件(SFC) 单文件组件是 Vue 中…

elementui组件

elementui组件

ElementUI 组件概述 ElementUI 是一套基于 Vue.js 的桌面端组件库,提供丰富的 UI 组件,适用于快速开发中后台系统。以下是其核心组件分类及典型用法。 基础组件 Butto…