当前位置:首页 > VUE

vue computed实现机制

2026-02-18 11:28:57VUE

Vue computed 实现机制

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

vue computed实现机制

依赖收集与响应式

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

vue computed实现机制

// 伪代码:计算属性初始化
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 标志实现的:

  • 初次访问时,计算属性会执行计算并缓存结果。
  • 依赖数据变化时,标记 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 中,方法的实现通常通过 methods 选项完成。以下是 Vue 方法实现的核心要点和示例: 基本方法定义 在 Vue 组件中定义方法时,需将函数声明放在 methods 对象内。这些方…

vue实现muli

vue实现muli

Vue 实现多语言(i18n)支持 在 Vue 项目中实现多语言(i18n)功能,通常使用 vue-i18n 插件。以下是具体实现步骤: 安装 vue-i18n npm install vue-i…

vue实现画图

vue实现画图

Vue 实现画图功能 在 Vue 中实现画图功能通常需要结合 HTML5 的 <canvas> 元素或第三方库。以下是几种常见的方法: 使用原生 Canvas API 通过 Vue 直接…

vue滚动实现

vue滚动实现

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

vue 实现登录

vue 实现登录

Vue 实现登录功能 创建登录表单组件 在 Vue 项目中创建一个登录表单组件(如 Login.vue),包含用户名和密码输入框以及提交按钮。使用 v-model 实现双向数据绑定。 <tem…

vue实现白板

vue实现白板

Vue实现白板功能 使用Vue实现白板功能可以通过HTML5的Canvas API结合Vue的响应式特性来完成。以下是实现白板功能的关键步骤: 安装依赖 在Vue项目中安装必要的依赖,如vue-dr…