当前位置:首页 > VUE

vue watch的实现原理

2026-01-23 00:22:57VUE

Vue 中 watch 的实现原理

Vue 的 watch 功能基于响应式系统的依赖收集和触发机制。当监听的数据变化时,会执行用户定义的回调函数。

依赖收集阶段

在组件初始化时,Vue 会遍历 watch 选项,为每个被监听的数据创建一个 Watcher 实例。这个 Watcher 会在首次执行时触发被监听数据的 getter,从而将自身添加到该数据的依赖列表中。

// 简化版 Watcher 构造过程
new Watcher(vm, expOrFn, callback, { deep: true })

深度监听的实现

当设置 deep: true 时,Vue 会递归遍历被监听对象的所有属性,触发每个子属性的 getter 来收集依赖:

vue watch的实现原理

if (this.deep) {
  traverse(value) // 递归访问所有嵌套属性
}

触发更新阶段

当被监听的数据发生变化时,会触发 setter 通知所有依赖的 WatcherWatcher 会执行回调函数,并传入新值和旧值:

// 简化版更新逻辑
update() {
  const newValue = this.get()
  const oldValue = this.value
  this.cb.call(this.vm, newValue, oldValue)
}

立即执行的实现

当设置 immediate: true 时,Vue 会在创建 Watcher 后立即执行一次回调函数:

vue watch的实现原理

if (this.immediate) {
  this.cb.call(this.vm, this.value, null)
}

与计算属性的区别

watch 和计算属性都基于相同的响应式系统,但主要区别在于:

  • 计算属性用于派生状态,具有缓存特性
  • watch 更适合执行副作用操作,如异步请求或复杂逻辑

性能优化建议

对于大型对象或数组,使用 deep 监听会带来性能开销。可以通过监听特定路径或使用计算属性优化:

watch: {
  'obj.key': function(newVal) {
    // 只监听特定属性
  }
}

Vue 3 的 watch API 在 Composition API 中进一步优化,提供了更灵活的监听方式,但核心原理保持不变。

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

相关文章

vue实现访问量

vue实现访问量

Vue 实现访问量统计的方法 使用前端计数 在 Vue 中可以通过简单的计数器实现页面访问量的统计。这种方法适合小型项目或演示用途。 // 在 Vue 组件中 data() { return {…

vue设计与实现 书

vue设计与实现 书

vue设计与实现 书 《Vue.js设计与实现》是一本深入探讨Vue.js框架内部原理和设计思想的书籍,适合希望深入理解Vue.js的开发者。以下是关于这本书的详细信息: 书籍内容 《Vue…

vue实现用户信息表

vue实现用户信息表

Vue 实现用户信息表的方法 使用 Vue CLI 创建项目 安装 Vue CLI 并初始化项目: npm install -g @vue/cli vue create user-info-tabl…

vue的艾特功能实现

vue的艾特功能实现

Vue 的 @ 功能实现 在 Vue 中实现类似社交平台的 @ 功能,通常涉及输入框的监听、用户匹配和选择插入。以下是具体实现方法: 监听输入框内容 使用 v-model 绑定输入框内容,并通过 @…

vue实现store

vue实现store

Vue 实现 Store 在 Vue 中,可以通过 Vuex 或 Pinia 实现全局状态管理(Store)。以下是两种主流方案的实现方法。 使用 Vuex 实现 Store Vuex 是 Vue…

vue实现贴图

vue实现贴图

Vue 实现贴图功能 在Vue中实现贴图功能通常涉及将图片动态添加到指定位置或元素上。以下是几种常见实现方式: 使用v-bind动态绑定图片 通过数据驱动的方式动态更换图片源: <tem…