当前位置:首页 > VUE

vue watch实现过程

2026-01-17 00:14:55VUE

Vue Watch 的实现过程

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

初始化 Watcher

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

vue watch实现过程

// 简化版 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)决定是否执行回调函数。

vue watch实现过程

// 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 会在创建时立即执行一次回调函数,而非等待数据变化。

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

总结

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

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

相关文章

vue实现导出

vue实现导出

Vue 实现导出功能的方法 在 Vue 项目中实现导出功能通常涉及将数据导出为 Excel、CSV 或其他格式。以下是几种常见的实现方式: 使用 xlsx 库导出 Excel 安装 xlsx 库:…

vue实现影院

vue实现影院

Vue实现影院功能的基本思路 使用Vue框架开发影院功能需要结合前端组件化开发、状态管理以及后端API交互。以下是关键实现步骤: 影院页面布局设计 影院页面通常分为顶部导航栏、影院列表区域和底部导航…

vue实现输入地址

vue实现输入地址

Vue 实现输入地址功能 在 Vue 中实现输入地址功能,可以通过结合表单输入、地图 API(如高德、百度或 Google Maps)以及地址自动补全等方式完成。以下是几种常见方法: 使用高德地图…

vue 实现设置密码

vue 实现设置密码

Vue 实现设置密码功能 在 Vue 中实现设置密码功能通常涉及表单输入、验证和提交逻辑。以下是实现的基本步骤和代码示例。 创建密码表单组件 使用 Vue 的单文件组件(SFC)创建一个密码设置表单…

vue导航栏实现

vue导航栏实现

Vue 导航栏实现方法 基础路由配置 安装 vue-router 并配置路由表,在 router/index.js 中定义路径与组件的映射关系: import { createRouter, cre…

vue实现下拉

vue实现下拉

Vue 实现下拉功能 使用原生 HTML 和 Vue 指令 通过 Vue 的 v-model 和 v-show 或 v-if 指令实现简单的下拉功能。 <template> <…