当前位置:首页 > VUE

vue watch实现原理

2026-01-17 00:13:38VUE

Vue 的 watch 实现原理

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
分享给朋友:

相关文章

vue实现用户信息删除

vue实现用户信息删除

Vue 实现用户信息删除功能 在 Vue 中实现用户信息删除功能通常涉及前端界面交互和后端 API 调用。以下是实现步骤: 前端界面设计 创建删除按钮或操作项,通常使用 @click 事件触发删除操…

vue el 实现

vue el 实现

Vue 中使用 Element UI (el) 的实现方法 Element UI 是一个基于 Vue 的组件库,提供丰富的 UI 组件,常用于快速构建企业级中后台产品。以下介绍 Vue 项目中集成和使…

vue滚动实现

vue滚动实现

Vue 滚动实现方法 使用原生滚动 在 Vue 中可以通过 ref 获取 DOM 元素,调用原生滚动方法实现滚动效果。适用于简单场景。 <template> <div ref=…

vue实现接口

vue实现接口

在 Vue 中实现接口请求 Vue 本身不直接提供 HTTP 请求功能,通常需要借助第三方库如 axios 或 fetch 来实现接口请求。以下是几种常见方法: 使用 axios 发送请求 安装 a…

vue实现布局

vue实现布局

Vue 实现布局方法 Vue 提供了多种方式实现页面布局,可以通过组件化、CSS 框架或自定义样式完成。以下是几种常见方法: 使用 CSS Flexbox 或 Grid 通过 Vue 单文件组件结合…

vue 实现loading

vue 实现loading

Vue 实现 Loading 的方法 使用 v-if 和 v-show 控制显示 在 Vue 中可以通过 v-if 或 v-show 控制 loading 组件的显示与隐藏。v-if 会动态创建或销毁…