当前位置:首页 > VUE

vue watch实现原理

2026-01-17 00:13:38VUE

Vue 的 watch 实现原理

Vue 的 watch 功能基于响应式系统的依赖收集和派发更新机制实现。核心原理是通过监听数据变化并触发回调函数。

依赖收集阶段

  • 在组件初始化时,Vue 会遍历 watch 选项,为每个被监听属性创建对应的 Watcher 实例。
  • 这些 Watcher 会将被监听属性添加到自己的依赖列表中。
  • 当属性被访问时,触发 getterWatcher 会被当前属性的 Dep(依赖管理器)收集。

派发更新阶段

  • 当被监听属性发生变化时,触发 setter
  • setter 会通知对应的 DepDep 会遍历所有订阅它的 Watcher 并调用 update 方法。
  • Watcherupdate 方法会执行注册的回调函数,并将新旧值作为参数传入。

深度监听实现

  • 如果设置了 deep: true,Vue 会递归遍历被监听对象的所有属性。
  • 为每个子属性也创建 Watcher,确保嵌套属性变化也能触发回调。

立即触发实现

  • 如果设置了 immediate: true,Vue 会在 Watcher 创建后立即执行一次回调函数。
  • 此时旧值为 undefined,新值为当前属性值。

异步更新机制

  • 默认情况下,watch 的回调是异步执行的。
  • Vue 会将回调推入异步队列,等待当前事件循环结束后统一执行。
  • 可以通过 sync: true 选项强制同步执行。

源码关键逻辑

// 简化版实现逻辑
function createWatcher(vm, expOrFn, handler, options) {
  const watcher = new Watcher(vm, expOrFn, handler, {
    deep: !!options.deep,
    immediate: !!options.immediate,
    sync: !!options.sync
  });

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

  return function unwatchFn() {
    watcher.teardown();
  }
}

与计算属性的区别

  • watch 允许执行异步操作,计算属性必须是同步的。
  • watch 更通用,可以监听任何数据变化,计算属性基于其依赖进行缓存。
  • watch 没有返回值,计算属性必须返回一个值。

性能优化建议

  • 避免过度使用深度监听,特别是大型对象。
  • 对于需要监听多个属性的情况,考虑使用计算属性 + watch 的组合。
  • 在不需要时及时调用 unwatch 函数取消监听。

vue watch实现原理

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

相关文章

vue实现路由导航

vue实现路由导航

路由导航的实现方式 在Vue中,路由导航主要通过Vue Router实现。Vue Router是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。 基本路由配置 安装Vue Router后…

vue怎么实现页面返回

vue怎么实现页面返回

Vue 实现页面返回的方法 在 Vue 中实现页面返回功能,可以通过以下几种方式完成,具体取决于项目使用的路由模式和技术栈。 使用 Vue Router 的编程式导航 通过 this.$route…

vue  实现tab

vue 实现tab

实现 Tab 切换功能 在 Vue 中实现 Tab 切换功能可以通过动态组件或条件渲染完成。以下是两种常见方法: 使用 v-if 或 v-show 实现条件渲染 通过绑定 currentTab 变…

实现vue table

实现vue table

Vue 表格实现方法 基础表格实现 使用 Vue 的 v-for 指令可以快速渲染表格数据。在模板中定义表格结构,通过数据绑定动态生成行和列。 <template> <tab…

vue实现动画

vue实现动画

Vue 实现动画的方法 Vue 提供了多种方式来实现动画效果,包括内置的过渡系统、第三方动画库以及直接操作 CSS 或 JavaScript 动画。 使用 Vue 内置过渡系统 Vue 的 <…

利用vue 实现

利用vue 实现

以下是利用 Vue 实现常见功能的几种方法,分为不同场景和技术要点: 数据绑定与响应式更新 Vue 的核心特性是数据绑定,通过 v-model 实现双向绑定: <template>…