当前位置:首页 > 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 的核心原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是这些核心原理的具体实现方式: 响应式系统 Vue 的响应式系统基于 Object.define…

eventbus实现原理vue

eventbus实现原理vue

EventBus 实现原理 EventBus 在 Vue 中通常用于跨组件通信,其核心原理基于发布-订阅模式。通过一个中央事件总线,组件可以订阅事件或触发事件,实现非父子组件间的通信。 核心机制 E…

vue set实现原理

vue set实现原理

Vue.set 的实现原理 Vue.set 是 Vue.js 提供的一个全局 API,用于向响应式对象添加新属性并确保其也是响应式的。其核心原理基于 Vue 的响应式系统实现。 响应式系统基…

vue checkbox实现原理

vue checkbox实现原理

Vue Checkbox 实现原理 Vue 中的 Checkbox 实现主要依赖于 v-model 指令,通过双向数据绑定将 checkbox 的选中状态与 Vue 实例的数据属性关联起来。 基本实…

vue评论框架实现

vue评论框架实现

实现基础评论组件结构 使用Vue单文件组件构建评论框架的基础结构,包含评论列表和评论表单。模板部分需包含评论容器、评论项和表单提交区域。 <template> <div cla…

vue组件实现原理

vue组件实现原理

Vue 组件实现原理 Vue 组件的核心实现基于以下机制: 组件注册与模板解析 Vue 组件通过 Vue.component() 或单文件组件(.vue 文件)注册。模板会被编译成渲染函数,最终生成…