当前位置:首页 > VUE

vue框架computed实现原理

2026-02-25 04:22:14VUE

Vue 中 computed 的实现原理

Vue 的 computed 属性是基于响应式依赖的缓存机制,通过以下核心机制实现:

依赖收集与响应式

computed 属性在初始化时会创建一个 Watcher 实例,并将该 computed 属性的 getter 函数作为求值函数。当首次访问 computed 属性时,会执行 getter 函数,触发依赖的响应式数据的 getter,从而将这些依赖收集到当前 Watcher 的依赖列表中。

vue框架computed实现原理

缓存机制

computed 属性具有缓存特性,只有当其依赖的响应式数据发生变化时,才会重新计算。Vue 通过 dirty 标志位控制是否需要重新计算。初始时 dirtytrue,表示需要计算;计算完成后 dirty 置为 false。只有当依赖变更时,dirty 才会被重新置为 true

惰性求值

computed 属性是惰性求值的,只有在模板或代码中实际访问该属性时才会触发计算。如果依赖未变化,则直接返回缓存值,避免不必要的计算开销。

vue框架computed实现原理

实现伪代码

以下是简化后的 computed 实现逻辑:

class Watcher {
  constructor(vm, getter, cb, options) {
    this.vm = vm;
    this.getter = getter;
    this.dirty = true; // 初始时需要计算
    this.value = undefined;
    this.deps = [];
  }

  evaluate() {
    this.value = this.getter.call(this.vm);
    this.dirty = false; // 计算完成
  }

  update() {
    this.dirty = true; // 依赖变更,标记需要重新计算
  }
}

function defineComputed(vm, key, getter) {
  const watcher = new Watcher(vm, getter);

  Object.defineProperty(vm, key, {
    get() {
      if (watcher.dirty) {
        watcher.evaluate();
      }
      return watcher.value;
    }
  });
}

与 methods 的区别

computedmethods 的关键区别在于缓存机制。computed 只在依赖变化时重新计算,而 methods 每次调用都会执行函数。对于需要频繁计算且依赖固定的场景,computed 性能更优。

注意事项

  • 避免在 computed 中执行异步操作或副作用操作,它应是纯函数。
  • computed 默认只有 getter,但可以通过显式声明 setter 实现双向绑定。
  • 在 Vue 3 中,computed 通过 Refeffect 实现,原理类似但基于 Proxy 的响应式系统。

标签: 框架原理
分享给朋友:

相关文章

vue框架实现登录

vue框架实现登录

Vue 框架实现登录功能 使用 Vue 框架实现登录功能需要结合前端和后端交互,以下是一个完整的实现方案。 创建登录表单 在 Vue 组件中创建登录表单,包含用户名和密码输入框。 <temp…

vue computed 实现原理

vue computed 实现原理

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

vue事件实现原理

vue事件实现原理

Vue 事件实现原理 Vue 的事件系统基于发布-订阅模式,通过 $on、$emit 等方法实现组件间通信。以下是核心实现原理的分解: 事件注册与存储 Vue 实例内部通过 _events 对象存…

vue keepalive 实现原理

vue keepalive 实现原理

Vue KeepAlive 实现原理 Vue 的 KeepAlive 是一个内置组件,用于缓存不活动的组件实例,避免重复渲染,提升性能。以下是其核心实现原理: 缓存机制 KeepAlive 通过维护…

vue框架实现定位

vue框架实现定位

Vue 实现定位的方法 在 Vue 中实现定位功能通常涉及浏览器原生 API 或第三方库的集成。以下是几种常见实现方式: 使用浏览器 Geolocation API 通过 navigator.g…

vue框架实现增加

vue框架实现增加

使用 Vue.js 实现数据新增功能 在 Vue.js 中实现数据新增功能通常涉及表单绑定、事件处理和状态管理。以下是一个完整的实现示例: 表单绑定与数据模型 创建表单并绑定数据模型: <…