当前位置:首页 > VUE

vue computed 实现原理

2026-03-29 11:37:55VUE

在 Vue.js 中,computed 属性的实现原理主要依赖于响应式系统和依赖收集机制。以下是 computed 属性的核心实现原理:

1. 响应式依赖

Vue 的 computed 属性是基于其响应式系统实现的。每个计算属性本质上是一个 getter 函数,当计算属性被访问时,Vue 会执行这个 getter 函数,并收集其中访问的所有响应式依赖(如 dataprops 中的属性)。

vue computed 实现原理

2. 依赖收集

Vue 使用 Watcher 类来跟踪依赖关系。计算属性的 getter 会被包裹在一个 Watcher 中,当计算属性被访问时:

  • 执行 getter 函数。
  • getter 执行过程中,如果访问了其他响应式数据,这些数据的 getter 会触发,将当前的 Watcher 添加到它们的依赖列表中(即“依赖收集”)。

3. 缓存机制

计算属性具有缓存功能:

vue computed 实现原理

  • 只有当其依赖的响应式数据发生变化时,计算属性才会重新计算。
  • 如果依赖没有变化,多次访问计算属性会直接返回缓存的值,而不会重新执行 getter

4. 惰性求值

计算属性是惰性的,即:

  • 如果没有访问计算属性,它的 getter 不会执行。
  • 只有在其依赖的响应式数据变化时,才会标记为“脏”(dirty),并在下次访问时重新计算。

5. 实现伪代码

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

class Watcher {
  constructor(vm, fn) {
    this.vm = vm;
    this.getter = fn;
    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(target, key, getter) {
  const watcher = new Watcher(target, getter);

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

6. methods 的区别

  • 缓存computed 会缓存结果,而 methods 每次调用都会重新执行。
  • 响应式computed 自动追踪依赖,而 methods 需要手动调用。

7. watch 的区别

  • 用途computed 适合派生状态,watch 适合副作用操作。
  • 性能computed 有缓存,watch 每次变化都会执行回调。

这种设计使得 computed 在需要基于响应式数据派生复杂逻辑时非常高效,避免了不必要的重复计算。

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

相关文章

vue实现主页

vue实现主页

Vue 实现主页的基本步骤 创建一个 Vue 主页通常涉及以下几个关键步骤,从项目初始化到页面布局和功能实现。 初始化 Vue 项目 使用 Vue CLI 或 Vite 初始化项目。Vue CLI…

vue实现动态

vue实现动态

Vue 实现动态路由的方法 在 Vue 中实现动态路由通常涉及以下几个关键步骤: 使用 Vue Router 的动态路由匹配 通过 Vue Router 的 :param 语法可以实现动态路由匹配。…

vue 实现跳转

vue 实现跳转

Vue 实现页面跳转的方法 在 Vue 中实现页面跳转通常可以通过以下几种方式实现,具体选择取决于项目需求和技术栈(如是否使用 Vue Router)。 使用 Vue Router 进行编程式导航…

vue实现computed

vue实现computed

Vue 中 computed 的实现原理 computed 属性是 Vue 的一个核心特性,它基于响应式依赖进行缓存,仅在依赖发生变化时重新计算。以下是 computed 的实现方式: 基本用法 在…

vue工序实现

vue工序实现

Vue 工序实现方法 在Vue中实现工序(或流程)功能,通常涉及状态管理、组件通信和动态渲染。以下是几种常见方法: 使用动态组件 通过Vue的<component :is="currentCo…

vue实现搜索查询

vue实现搜索查询

Vue 实现搜索查询的方法 双向绑定实现实时搜索 在Vue中可以通过v-model绑定输入框的值,结合计算属性或watch监听输入变化实现实时搜索。 <template> <i…