当前位置:首页 > 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 实现边框的方法 在 Vue 中实现边框效果可以通过多种方式完成,包括内联样式、CSS 类绑定、动态样式以及使用第三方 UI 库。以下是几种常见的实现方法。 内联样式绑定 使用 Vue 的 :…

vue实现方法

vue实现方法

Vue 实现方法 Vue 是一种流行的前端框架,用于构建用户界面和单页应用。以下是几种常见的 Vue 实现方法: 创建 Vue 实例 通过 new Vue() 创建一个 Vue 实例,传入配置对象,…

vue 路由 实现

vue 路由 实现

Vue 路由实现方法 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是实现 Vue 路由的详细步骤: 安装 Vue Router 通过 npm 或 ya…

vue实现全景

vue实现全景

Vue 实现全景效果的方法 使用 Vue 实现全景效果通常需要结合第三方库或框架,以下是几种常见的方法: 使用 Three.js 和 Vue-Three.js Three.js 是一个强大的 3D…

vue实现复选

vue实现复选

Vue 实现复选框 在 Vue 中实现复选框可以通过 v-model 指令绑定数据,同时结合 input 元素的 type="checkbox" 属性来实现。以下是几种常见的实现方式: 单个复选框…

vue实现动画

vue实现动画

Vue 实现动画的方法 Vue 提供了多种方式来实现动画效果,包括内置的过渡系统、第三方动画库以及直接操作 CSS 或 JavaScript 动画。 使用 Vue 内置过渡系统 Vue 的 <…