当前位置:首页 > VUE

vue的wacth实现原理

2026-01-23 14:06:51VUE

Vue 的 watch 实现原理

Vue 的 watch 功能通过依赖收集和响应式系统实现,核心是利用 Watcher 类监听数据变化并触发回调。

依赖收集与响应式系统

Vue 的响应式系统基于 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现数据劫持。当数据被访问时,依赖(即 Watcher 实例)会被收集到当前属性的依赖列表中。数据变化时,依赖列表中的 Watcher 会被通知并执行更新。

Watcher 类的作用

watch 选项或 $watch 方法会创建一个 Watcher 实例。Watcher 负责:

vue的wacth实现原理

  • 解析监听的表达式(如 'a.b.c'),触发对应属性的 getter,从而将自身添加到依赖列表中。
  • 当数据变化时,触发 setter,通知 Watcher 执行回调函数。

回调触发机制

Watcher 在数据变化时会通过调度队列(如 queueWatcher)异步执行回调。Vue 通过 nextTick 确保回调在 DOM 更新后执行,避免重复计算和渲染。

深度监听实现

deep: true 时,Watcher 会递归遍历监听对象的所有属性,触发它们的 getter,从而收集所有嵌套属性的依赖。任何嵌套变化都会触发回调。

vue的wacth实现原理

立即执行与旧值获取

immediate: true 时,Watcher 会在创建后立即执行一次回调。回调的参数 newValoldVal 通过 Watcher 内部缓存的上一次值实现对比。

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

// 简化版 Watcher 实现
class Watcher {
  constructor(vm, expOrFn, cb, options) {
    this.vm = vm;
    this.cb = cb;
    this.deep = !!options.deep;
    this.value = this.get(); // 触发依赖收集
  }

  get() {
    pushTarget(this); // 将当前 Watcher 设为全局依赖
    const value = parsePath(this.expOrFn)(this.vm); // 访问数据,触发 getter
    if (this.deep) traverse(value); // 深度遍历
    popTarget(); // 恢复之前的依赖
    return value;
  }

  update() {
    const oldVal = this.value;
    this.value = this.get(); // 重新获取新值
    this.cb.call(this.vm, this.value, oldVal); // 触发回调
  }
}

与 computed 的区别

watch 是主动监听数据变化并执行副作用,而 computed 是惰性求值,只有依赖变化且被访问时才重新计算。computed 会缓存结果,避免重复计算。

总结

Vue 的 watch 通过 Watcher 类、依赖收集和响应式系统实现数据监听。其核心是属性访问时的依赖绑定和变化时的回调调度,支持深度监听、异步更新和旧值比对等功能。

标签: 原理vue
分享给朋友:

相关文章

vue实现aop切面

vue实现aop切面

Vue 实现 AOP 切面编程的方法 在 Vue 中实现 AOP(面向切面编程)可以通过多种方式,以下是几种常见的实现方法: 使用 Vue 混入(Mixins) Vue 的混入机制可以用于实现横切…

vue实现本地数据存储

vue实现本地数据存储

使用 localStorage 或 sessionStorage Vue 中可以直接调用浏览器提供的 localStorage 或 sessionStorage API 进行数据存储。localSto…

vue设计与实现目录

vue设计与实现目录

以下是《Vue设计与实现》一书的典型目录结构(根据常见技术书籍及Vue核心内容整理): 响应式系统 响应式数据的基本原理 依赖收集与触发更新 实现简易响应式系统 Proxy与Reflec…

vue 实现豆瓣

vue 实现豆瓣

以下是基于 Vue 实现豆瓣电影类功能的实现方案,涵盖核心模块和技术要点: 数据获取与 API 调用 使用豆瓣开放 API(需注意调用频率限制)或第三方代理接口 推荐 axios 进行异步请求,配合…

vue实现markdown

vue实现markdown

Vue 实现 Markdown 编辑器 在 Vue 中实现 Markdown 编辑器可以通过集成第三方库或自定义解析器完成。以下是两种常见方法: 使用第三方库(如 marked 或 markdown…

vue observer实现

vue observer实现

Vue Observer 实现原理 Vue 的响应式系统核心是通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现的 Observer 模式。以下是关键实现细…