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

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

总结

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

vue watch实现过程

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

相关文章

vue实现多级组件

vue实现多级组件

实现多级组件的基本结构 在Vue中实现多级组件通常涉及父子组件嵌套,通过props向下传递数据,通过$emit向上传递事件。多级组件的核心是递归或动态组件渲染。 <!-- 父组件 Paren…

vue 页签实现

vue 页签实现

Vue 页签实现方法 在 Vue 中实现页签功能通常涉及动态组件、路由或状态管理。以下是几种常见的实现方式: 使用动态组件 通过 Vue 的 <component> 动态组件结合 v-…

vue表格重置怎么实现

vue表格重置怎么实现

重置表格数据的方法 在Vue中重置表格数据通常需要操作绑定的数据源,以下是几种常见实现方式: 直接重置数据源 // 假设表格绑定的是tableData this.tableData = [...t…

vue实现查询替换

vue实现查询替换

Vue 实现查询替换功能 在 Vue 中实现查询替换功能,可以通过数据绑定和字符串操作方法结合实现。以下是具体实现方式: 基础实现 <template> <div>…

vue前端分页怎么实现

vue前端分页怎么实现

前端分页实现方法 在Vue中实现前端分页通常涉及数据分割和页面控制逻辑。以下是常见的实现方式: 使用计算属性分页 通过计算属性对数据进行切片处理: computed: { paginatedD…

vue实现飘窗原理

vue实现飘窗原理

vue实现飘窗原理 飘窗效果通常指在页面上悬浮显示的弹窗或通知,跟随页面滚动或固定在某个位置。Vue实现这一效果主要依赖组件化开发、CSS定位和动态数据绑定。 组件结构设计 创建一个独立的Vue组…