当前位置:首页 > 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 watch实现原理

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

相关文章

vue查看更多怎么实现

vue查看更多怎么实现

实现 Vue 的“查看更多”功能 数据截取与显示控制 通过 v-if 或 v-show 控制内容的显示与隐藏。初始状态下只显示部分内容,点击“查看更多”后展开完整内容。 <template&…

vue实现本地数据存储

vue实现本地数据存储

使用 localStorage 或 sessionStorage Vue 中可以直接调用浏览器提供的 localStorage 或 sessionStorage API 进行数据存储。localSto…

vue实现防抖节流

vue实现防抖节流

Vue 中实现防抖(Debounce) 防抖的核心是延迟执行函数,在连续触发时取消前一次的调用,只执行最后一次。适用于输入框搜索、窗口大小调整等场景。 方法1:使用 Lodash 的 _.debou…

vue实现按卡片轮播

vue实现按卡片轮播

实现卡片轮播的基本思路 在Vue中实现卡片轮播可以通过结合v-for指令和动态样式绑定完成。核心是维护一个当前显示卡片的索引,通过CSS过渡效果实现平滑切换。 基础实现步骤 模板部分 使用v-fo…

vue动态组建实现原理

vue动态组建实现原理

Vue 动态组件的实现原理 Vue 的动态组件主要通过 component 标签和 is 属性实现,核心原理涉及组件的动态切换和渲染机制。 动态组件的实现方式 使用 component 标签和 i…

vue实现下拉层级

vue实现下拉层级

Vue实现下拉层级菜单 使用Vue实现下拉层级菜单可以通过递归组件或动态渲染的方式完成。以下是两种常见实现方法: 递归组件实现 创建一个递归组件处理多级菜单结构: <template>…