当前位置:首页 > VUE

vue computed实现原理

2026-03-10 07:17:45VUE

Vue computed 实现原理

Vue 的 computed 属性是基于响应式系统的依赖追踪机制实现的。其核心原理是通过 Object.definePropertyProxy(Vue 3)将计算属性转换为响应式数据,并在依赖的响应式数据变化时重新计算。

依赖收集与触发更新

计算属性在首次访问时会执行其 getter 函数,并在此过程中触发依赖的响应式数据的 get 拦截。Vue 的响应式系统会记录当前正在计算的 computed 属性与依赖数据之间的关系。

当依赖的响应式数据发生变化时,会触发 setterProxyset 拦截,通知所有依赖它的计算属性重新计算。计算属性会缓存上一次的计算结果,只有在依赖变化时才会重新计算。

惰性求值与缓存

计算属性是惰性求值的,只有在被访问时才会计算。如果依赖的数据没有变化,多次访问计算属性会直接返回缓存的结果,而不会重复计算。

实现示例(简化版)

以下是一个简化的 computed 实现逻辑,展示了其核心机制:

function defineComputed(target, key, computeFn) {
  let value;
  let dirty = true; // 标记是否需要重新计算

  const effect = () => {
    dirty = true;
    // 触发依赖更新(例如重新渲染)
  };

  // 在计算过程中收集依赖
  const runner = effect(() => {
    value = computeFn();
    dirty = false;
  }, { lazy: true });

  Object.defineProperty(target, key, {
    get() {
      if (dirty) {
        runner(); // 重新计算
      }
      return value;
    },
    set() {
      console.warn('Computed property is read-only');
    }
  });
}

Vue 3 中的优化

在 Vue 3 中,computed 基于 ProxyReflect 实现,利用了更高效的依赖追踪机制。computed 返回的是一个 ref 对象,可以通过 .value 访问其值。

vue computed实现原理

import { computed } from 'vue';

const count = ref(0);
const double = computed(() => count.value * 2);

总结

Vue 的 computed 通过响应式依赖追踪、惰性求值和缓存机制,实现了高效的计算属性。其核心思想是减少不必要的计算,仅在依赖变化时重新计算,从而提升性能。

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

相关文章

实现vue

实现vue

安装Vue.js 通过npm安装Vue.js是最常见的方式。确保已安装Node.js和npm,运行以下命令: npm install vue 或者使用CDN直接引入: <script src…

vue实现过程

vue实现过程

Vue 的实现过程 Vue 的实现过程可以分为多个核心模块,包括响应式系统、虚拟 DOM、模板编译等。以下是 Vue 的主要实现过程分析。 响应式系统 Vue 的响应式系统基于 Object.def…

vue实现token

vue实现token

Vue 中实现 Token 认证的方法 在 Vue 中实现 Token 认证通常涉及前端与后端的交互,包括 Token 的获取、存储、发送和刷新等操作。以下是具体实现步骤: 获取 Token 用户登…

vue实现爬虫

vue实现爬虫

Vue 实现爬虫的基本思路 Vue.js 本身是一个前端框架,主要用于构建用户界面。要实现爬虫功能,通常需要结合后端技术或浏览器自动化工具。以下是几种常见的方法: 方法一:Vue + Node.js…

vue实现评价

vue实现评价

Vue实现评价功能 数据绑定与双向绑定 Vue的核心特性是数据绑定和双向绑定,通过v-model指令可以轻松实现表单输入与应用状态之间的双向绑定。在评价功能中,可以使用v-model绑定评论文本和评分…

vue实现layout

vue实现layout

Vue 实现 Layout 布局的方法 在 Vue 中实现 Layout 布局通常涉及路由嵌套、组件化设计和动态渲染。以下是几种常见的实现方式: 使用嵌套路由 通过 Vue Router 的嵌套路由…