当前位置:首页 > VUE

vue computed实现机制

2026-02-18 11:28:57VUE

Vue computed 实现机制

Vue 的 computed 属性是基于响应式依赖的缓存机制,其核心实现依赖于 Vue 的响应式系统和依赖收集。

依赖收集与响应式

Vue 通过 Object.definePropertyProxy(Vue 3)劫持数据的访问和修改。当计算属性被访问时,会触发其 getter 函数,此时 Vue 会将当前计算属性和其依赖的响应式数据建立关联。

// 伪代码:计算属性初始化
function initComputed(vm, computed) {
  const watchers = {};
  for (const key in computed) {
    const getter = computed[key];
    watchers[key] = new Watcher(vm, getter, { lazy: true });
    defineComputed(vm, key, watchers[key]);
  }
}

缓存机制

计算属性会缓存计算结果,只有当其依赖的响应式数据发生变化时,才会重新计算。这是通过 dirty 标志实现的:

vue computed实现机制

  • 初次访问时,计算属性会执行计算并缓存结果。
  • 依赖数据变化时,标记 dirtytrue,下次访问时重新计算。
  • 未变化时直接返回缓存值。
// 伪代码:计算属性 getter
function createComputedGetter(key) {
  return function computedGetter() {
    const watcher = this._computedWatchers[key];
    if (watcher.dirty) {
      watcher.evaluate(); // 重新计算
    }
    if (Dep.target) {
      watcher.depend(); // 收集依赖
    }
    return watcher.value;
  };
}

与 Watch 的区别

  • computed 是惰性求值,依赖变化时才重新计算。
  • watch 是主动监听,适合执行副作用(如异步操作)。
  • computed 必须有返回值,watch 不需要。

性能优化

  • 避免在计算属性中执行耗时操作。
  • 减少不必要的依赖,拆分复杂计算属性。
  • Vue 3 的 computed 基于 Proxy 优化了依赖追踪效率。

实现流程总结

  1. 初始化阶段,为每个计算属性创建独立的 Watcher
  2. 访问计算属性时触发 getter,进行依赖收集。
  3. 依赖变化时标记 dirty,下次访问时重新计算。
  4. 无变化时直接返回缓存值,避免重复计算。

标签: 机制vue
分享给朋友:

相关文章

vue实现兼容

vue实现兼容

Vue 兼容性实现方案 Vue.js 的兼容性主要涉及对不同浏览器、Vue 版本以及第三方库的支持。以下是常见的兼容性解决方案: 浏览器兼容性 使用 Babel 转换 ES6+ 代码为 ES5 语…

vue实现openoffice

vue实现openoffice

Vue 中集成 OpenOffice 的实现方法 在 Vue 项目中集成 OpenOffice 通常需要通过后端服务或现有库实现文档的预览和编辑功能。以下是几种常见的实现方式: 使用 OnlyOff…

vue实现单击

vue实现单击

Vue 实现单击事件的方法 在 Vue 中实现单击事件可以通过 v-on 指令或简写的 @ 符号绑定事件处理器。以下是几种常见的实现方式: 基础用法 通过 v-on:click 或 @click 绑…

实现vue message

实现vue message

实现 Vue 消息提示组件 创建 Message 组件 在 src/components 目录下创建 Message.vue 文件,内容如下: <template> <tran…

vue实现监控

vue实现监控

Vue 实现监控功能的方法 在 Vue 中实现监控功能通常涉及数据变化监听、事件监听或第三方监控工具集成。以下是几种常见实现方式: 使用 Vue 的 watch 监听数据变化 通过 watch 可以…

vue实现滚动显示

vue实现滚动显示

Vue 实现滚动显示的几种方法 在 Vue 中实现滚动显示可以通过多种方式实现,以下是几种常见的方法: 使用 CSS 动画 通过 CSS 的 animation 属性结合 @keyframes 实现…