当前位置:首页 > VUE

vue watch怎么实现的

2026-02-24 15:26:23VUE

Vue 的 watch 实现原理

Vue 的 watch 功能通过响应式系统的依赖收集和触发机制实现。其核心是监听数据变化并执行回调函数。

初始化阶段

在 Vue 实例初始化时,如果选项中有 watch 配置,会调用 initWatch 方法。该方法遍历 watch 选项,为每个监听属性创建对应的 Watcher 实例。

function initWatch(vm, watch) {
  for (const key in watch) {
    const handler = watch[key];
    createWatcher(vm, key, handler);
  }
}

创建 Watcher

createWatcher 方法会根据监听属性的配置(函数、对象、字符串)创建对应的 Watcher 实例。如果是深度监听(deep: true),会递归遍历对象的所有属性进行依赖收集。

function createWatcher(vm, expOrFn, handler, options) {
  if (isPlainObject(handler)) {
    options = handler;
    handler = handler.handler;
  }
  if (typeof handler === 'string') {
    handler = vm[handler];
  }
  return vm.$watch(expOrFn, handler, options);
}

依赖收集

Watcher 实例化时,会执行 get 方法触发监听属性的 getter。在 getter 中,当前 Watcher 会被添加到依赖列表中(Dep.target)。

class Watcher {
  constructor(vm, expOrFn, cb, options) {
    this.vm = vm;
    this.cb = cb;
    this.deep = !!options.deep;
    this.getter = parsePath(expOrFn);
    this.value = this.get();
  }

  get() {
    pushTarget(this);
    const value = this.getter.call(this.vm, this.vm);
    if (this.deep) traverse(value);
    popTarget();
    return value;
  }
}

触发更新

当监听的数据发生变化时,会触发 setter 通知所有依赖的 Watcher 执行 update 方法。最终调用回调函数并传入新旧值。

class Watcher {
  update() {
    const oldValue = this.value;
    this.value = this.get();
    this.cb.call(this.vm, this.value, oldValue);
  }
}

深度监听实现

深度监听通过递归遍历对象的所有属性,触发每个属性的 getter 进行依赖收集。

function traverse(val) {
  if (typeof val !== 'object') return;
  for (const key in val) {
    traverse(val[key]);
  }
}

立即执行

如果配置了 immediate: true,会在 Watcher 创建后立即执行回调函数。

if (options.immediate) {
  cb.call(vm, watcher.value);
}

注销监听

调用 $watch 返回的函数可以注销监听,内部通过 Watcherteardown 方法实现。

vue watch怎么实现的

Vue.prototype.$watch = function(expOrFn, cb, options) {
  const watcher = new Watcher(this, expOrFn, cb, options);
  return function unwatchFn() {
    watcher.teardown();
  };
};

通过以上机制,Vue 实现了高效的数据监听功能,能够精确响应数据变化并执行相应的回调逻辑。

标签: vuewatch
分享给朋友:

相关文章

vue登录业务的实现

vue登录业务的实现

实现登录业务的基本流程 在Vue中实现登录业务通常涉及前端界面设计、表单验证、API请求交互、状态管理以及路由控制等环节。以下是核心实现步骤: 登录表单设计与验证 创建包含用户名和密码输入框的登录组…

vue实现视频会议

vue实现视频会议

使用 Vue 实现视频会议 技术选型 Vue.js 作为前端框架,结合 WebRTC 技术实现实时音视频通信。常用的库包括: peerjs:简化 WebRTC 的点对点连接。 socket.io:用…

vue 实现弹幕

vue 实现弹幕

vue 实现弹幕的方法 使用 CSS 动画和动态渲染 在 Vue 中实现弹幕效果,可以通过动态渲染弹幕元素并结合 CSS 动画实现。以下是具体步骤: 数据准备 创建一个数组存储弹幕数据,每条弹幕包…

vue实现类别

vue实现类别

Vue 实现类别的几种方法 在 Vue 中实现类别功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-bind:class 动态绑定类名 通过对象语法或数组语法动态绑定类名,根据条件添加或移…

vue单选实现

vue单选实现

Vue 单选实现 在 Vue 中实现单选功能可以通过多种方式完成,以下是几种常见的方法: 使用 v-model 绑定单选按钮 通过 v-model 绑定一个变量,可以实现单选效果。当用户选择不同的选…

vue 实现循环

vue 实现循环

Vue 实现循环的方法 在 Vue 中,可以使用 v-for 指令来实现循环渲染列表数据。以下是几种常见的循环实现方式: 基本数组循环 <template> <ul>…