当前位置:首页 > VUE

vue watch实现过程

2026-01-17 00:14:55VUE

Vue Watch 的实现过程

Vue 的 watch 用于监听响应式数据的变化,并在数据变化时执行回调函数。以下是其核心实现过程:

初始化 Watcher

在 Vue 实例初始化阶段,如果组件选项中定义了 watch,会遍历这些监听属性,为每个属性创建一个 Watcher 实例。Watcher 是 Vue 响应式系统的核心之一,负责依赖收集和触发更新。

// 简化版 Watcher 初始化逻辑
function initWatch(vm, watch) {
  for (const key in watch) {
    const handler = watch[key];
    createWatcher(vm, key, handler);
  }
}

依赖收集

Watcher 被创建时,会执行一次 getter 函数(即监听属性的值),触发数据的 get 拦截器。此时,Watcher 会被添加到当前属性的依赖列表(Dep)中。

// 依赖收集核心逻辑
class Dep {
  constructor() {
    this.subs = [];
  }
  depend() {
    if (Dep.target) {
      this.subs.push(Dep.target);
    }
  }
  notify() {
    this.subs.forEach(watcher => watcher.update());
  }
}

触发更新

当监听的属性值发生变化时,会触发 set 拦截器,调用 Dep.notify() 通知所有依赖的 Watcher 执行更新。Watcher 会根据配置(如 deepimmediate)决定是否执行回调函数。

// Watcher 更新逻辑
class Watcher {
  update() {
    if (this.lazy) {
      this.dirty = true;
    } else {
      this.run();
    }
  }
  run() {
    const value = this.get();
    if (value !== this.value || this.deep) {
      this.cb.call(this.vm, value, this.value);
      this.value = value;
    }
  }
}

深度监听(deep: true)

如果设置了 deep: trueWatcher 会递归遍历监听对象的所有子属性,为每个子属性也绑定依赖收集逻辑。

// 深度监听实现片段
function traverse(val) {
  if (typeof val !== 'object') return;
  for (const key in val) {
    traverse(val[key]);
  }
}

立即触发(immediate: true)

若配置了 immediate: trueWatcher 会在创建时立即执行一次回调函数,而非等待数据变化。

vue watch实现过程

// immediate 处理逻辑
if (this.immediate) {
  this.cb.call(this.vm, this.value, null);
}

总结

Vue 的 watch 通过 Watcher 机制实现,核心流程包括依赖收集、派发更新和回调执行。通过 deepimmediate 等配置项,可以扩展其监听行为。

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

相关文章

vue实现点击

vue实现点击

实现点击事件的基本方法 在Vue中实现点击事件可以通过v-on指令或@简写方式绑定。以下是常见的点击事件绑定方法: <template> <button v-on:click=…

实现 vue 框架

实现 vue 框架

Vue 框架的基本实现 Vue 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是实现 Vue 框架的基本步骤和核心概念。 核心概念 响应式数据绑定 Vue 的核心特性之一是响应式数…

vue 实现拖拉

vue 实现拖拉

Vue 实现拖拽功能的方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…

vue实现treeview

vue实现treeview

Vue 实现 TreeView 的方法 使用递归组件实现 TreeView 递归组件是 Vue 中实现 TreeView 的常见方式。通过组件调用自身,可以轻松处理嵌套的树形结构数据。 <te…

vue实现图片查看

vue实现图片查看

Vue 实现图片查看功能 在 Vue 中实现图片查看功能,可以通过原生实现或使用第三方库。以下是几种常见的方法: 原生实现方式 使用 Vue 的指令和事件绑定实现基础的图片查看功能。 <te…

vue实现文字复制

vue实现文字复制

Vue 实现文字复制的几种方法 使用 Clipboard API 在 Vue 中可以通过调用浏览器的 Clipboard API 实现文字复制功能。该方法兼容现代浏览器,无需额外依赖。 method…