当前位置:首页 > VUE

vue中computed实现原理

2026-01-21 05:42:38VUE

Vue中computed的实现原理

computed属性是Vue的核心特性之一,它基于响应式依赖进行缓存,仅在相关依赖发生改变时才会重新计算。

依赖收集与缓存机制

computed属性通过Object.definePropertyProxy(Vue 3)定义在组件实例上。初始化时创建一个Watcher实例,设置lazy标志为true表示惰性求值。

当首次访问computed属性时,会执行getter函数并触发依赖收集。Vue的响应式系统会记录哪些响应式数据被访问过,建立依赖关系。计算结果的缓存存储在Watcher实例的value属性中。

vue中computed实现原理

惰性更新策略

后续访问computed属性时,若依赖未变化则直接返回缓存值。当依赖数据发生变化时,标记computed为"dirty"状态,但不会立即重新计算。直到下次访问该属性时才会执行实际计算,这种延迟更新机制优化了性能。

与watch的区别

computed自动追踪依赖关系,而watch需要显式指定监听目标。computed适合派生状态,watch适合执行副作用操作。computed具有缓存特性,watch每次触发都会执行回调。

vue中computed实现原理

源码层面的关键实现

Vue 2.x版本中核心实现位于src/core/instance/state.js

function initComputed(vm, computed) {
  const watchers = vm._computedWatchers = Object.create(null)
  for (const key in computed) {
    const getter = typeof computed[key] === 'function' 
      ? computed[key] 
      : computed[key].get

    watchers[key] = new Watcher(
      vm,
      getter || noop,
      noop,
      { lazy: true }
    )

    defineComputed(vm, key, userDef)
  }
}

Vue 3使用computed函数和effect实现,基于Proxy的响应式系统:

function computed(getterOrOptions) {
  let getter, setter

  if (isFunction(getterOrOptions)) {
    getter = getterOrOptions
    setter = NOOP
  } else {
    getter = getterOrOptions.get
    setter = getterOrOptions.set
  }

  return new ComputedRefImpl(getter, setter)
}

性能优化要点

避免在computed中进行高开销操作,确保纯函数特性。合理设计依赖关系,防止不必要的重新计算。对于复杂计算可考虑使用memorization技术进一步优化。

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

相关文章

vue 实现长列表

vue 实现长列表

Vue 实现长列表的优化方案 虚拟滚动技术 虚拟滚动是处理长列表的高效方式,仅渲染可视区域内的元素。通过计算滚动位置动态加载和卸载DOM节点,大幅减少内存占用和渲染压力。 <template&…

vue实现简单的弹窗

vue实现简单的弹窗

使用 Vue 实现简单弹窗 组件基础结构 创建一个名为 Modal.vue 的组件文件,包含模板、脚本和样式部分: <template> <div class="modal-…

vue实现展开与收起

vue实现展开与收起

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

vue实现双折线图

vue实现双折线图

实现双折线图的步骤 安装必要的依赖库(如 ECharts 或 Chart.js),这里以 ECharts 为例: npm install echarts --save 在 Vue 组件中引入 EC…

vue实现a

vue实现a

Vue 实现 A 功能的方法 在 Vue 中实现 A 功能可以通过多种方式,具体取决于 A 功能的具体需求。以下是几种常见的实现方法: 使用 Vue 组件 通过创建自定义组件来实现 A 功能。组件可…

vue datepicker 实现

vue datepicker 实现

实现 Vue Datepicker 的基本方法 在 Vue 项目中实现日期选择功能,可以使用第三方库如 vue-datepicker 或 v-calendar。以下是两种常见实现方式: 安装 vu…