当前位置:首页 > VUE

vue中computed实现原理

2026-02-21 21:11:25VUE

Vue 中 computed 的实现原理

Vue 的 computed 属性是基于响应式依赖的缓存机制,其核心原理涉及依赖收集、缓存和惰性求值。

依赖收集与响应式

computed 属性通过 Object.definePropertyProxy(Vue 3)定义,在首次访问时会执行计算函数。计算过程中访问的响应式数据(如 data 或 props)会通过 getter 触发依赖收集,将当前 computed 属性作为依赖关联到这些数据上。

示例代码结构:

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

  Object.defineProperty(target, key, {
    get() {
      if (dirty) {
        cachedValue = computeFn();
        dirty = false;
      }
      return cachedValue;
    }
  });
}

缓存机制

计算属性会缓存计算结果,只有依赖的响应式数据变化时才会重新计算。Vue 通过 Watcher 实例管理这种关系:

  • 初始化时为 computed 创建 lazy Watcher(惰性求值)。
  • 依赖数据变化时标记 dirty 为 true,下次访问时重新计算。

触发更新流程

  1. 当依赖的响应式数据被修改时,触发 setter 通知所有关联的 Watcher。
  2. computed 的 Watcher 收到通知后标记 dirty 为 true,但不立即计算。
  3. 组件渲染时再次访问 computed 属性,触发 getter 重新计算并更新缓存。

与 methods 的区别

  • 缓存性:computed 只在依赖变化时重新计算;methods 每次调用都会执行。
  • 响应式:computed 自动追踪依赖,methods 需手动处理依赖关系。

Vue 3 的优化

Vue 3 使用 effectReactiveEffect 重构响应式系统:

  • computed 通过 computed() API 创建,基于 Ref 实现。
  • 采用 Proxy 减少递归依赖收集的开销。

Vue 3 示例:

import { computed } from 'vue';
const count = ref(0);
const double = computed(() => count.value * 2);

vue中computed实现原理

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

相关文章

vue动态渲染实现原理

vue动态渲染实现原理

Vue动态渲染实现原理 Vue的动态渲染核心基于响应式系统和虚拟DOM技术,通过数据驱动视图更新。以下是关键实现原理的分解: 响应式系统 Vue使用Object.defineProperty(Vue…

vue实现展开与收起

vue实现展开与收起

Vue 实现展开与收起功能 在 Vue 中实现展开与收起功能可以通过多种方式完成,以下是一些常见的方法: 使用 v-show 或 v-if 控制显示 通过 Vue 的指令 v-show 或 v-i…

vue穿梭框组件实现

vue穿梭框组件实现

实现基础穿梭框组件 在Vue中实现穿梭框组件,可以使用<el-transfer>(Element UI)或手动实现。以下是手动实现的核心逻辑: <template> &…

vue 实现递归

vue 实现递归

Vue 实现递归组件的方法 在 Vue 中实现递归组件通常用于处理树形结构数据,例如菜单、评论列表或文件目录。以下是实现递归组件的关键步骤: 定义递归组件 递归组件需要设置 name 属性,以便在模…

vue权限实现

vue权限实现

Vue 权限实现方案 基于路由的权限控制 通过路由守卫实现权限验证,在路由配置中添加meta字段标记权限要求。在router.beforeEach中检查用户权限与路由要求的匹配情况。 // rou…

vue 实现流程

vue 实现流程

Vue 实现流程 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是 Vue 实现的基本流程: 安装 Vue.js 通过 CDN 引入或使用 npm/yarn 安装:…