当前位置:首页 > VUE

vue中computed实现原理

2026-02-21 21:11:25VUE

Vue 中 computed 的实现原理

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

依赖收集与响应式

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

vue中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 实例管理这种关系:

vue中computed实现原理

  • 初始化时为 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
分享给朋友:

相关文章

vue底层实现

vue底层实现

Vue.js 的底层实现原理 Vue.js 是一个渐进式 JavaScript 框架,其核心实现主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是其关键实现细节: 响应式系统 Vue 2…

vue实现复制

vue实现复制

Vue 实现复制功能 在 Vue 中实现复制功能可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 Clipboard API Clipboard API 是现代浏览器提供的一种原生 AP…

vue实现绘图

vue实现绘图

Vue 实现绘图的方法 在 Vue 中实现绘图功能,可以通过多种方式实现,包括使用原生 HTML5 Canvas、第三方库(如 Fabric.js、Konva.js)或 SVG。以下是几种常见的实现方…

vue实现滑动条

vue实现滑动条

Vue 实现滑动条 在 Vue 中实现滑动条可以通过原生 HTML 的 <input type="range"> 或自定义组件实现。以下是两种常见方法: 使用原生 HTML 滑动条 通过…

vue实现开关灯

vue实现开关灯

Vue实现开关灯效果 使用Vue实现开关灯效果可以通过数据绑定和条件渲染完成。以下是具体实现方式: 创建Vue实例并定义数据 new Vue({ el: '#app', data: {…

实现vue页面回退

实现vue页面回退

监听浏览器返回事件 在Vue组件中使用beforeRouteLeave导航守卫,可以监听路由变化。该方法在离开当前路由前触发,适用于需要确认或保存数据的场景。 beforeRouteLeave(…