当前位置:首页 > 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属性中。

惰性更新策略

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

与watch的区别

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

源码层面的关键实现

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的响应式系统:

vue中computed实现原理

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 实现主题的方法 使用 CSS 变量动态切换主题 定义全局 CSS 变量,通过修改这些变量实现主题切换。在 Vue 的根组件或全局样式中定义变量: :root { --primary-co…

vue实现语音

vue实现语音

Vue 实现语音功能的方法 使用 Web Speech API Vue 可以结合 Web Speech API 实现语音识别和合成功能。Web Speech API 包含 SpeechRecognit…

vue实现tablegrid

vue实现tablegrid

Vue 实现 TableGrid 的方法 使用 Element UI 的 Table 组件 Element UI 提供了强大的 Table 组件,可以快速实现表格布局。安装 Element UI 后,…

vue实现input

vue实现input

Vue 实现 Input 输入框的方法 基本双向绑定 使用 v-model 指令实现双向数据绑定,适用于大多数表单场景: <template> <input v-model="…

vue实现滑块

vue实现滑块

Vue 实现滑块组件的方法 使用原生 HTML 和 Vue 指令 通过 Vue 的 v-model 和事件监听实现基础滑块功能。创建一个包含 input 元素的组件,类型设置为 range,并绑定到…

vue实现单据

vue实现单据

Vue 实现单据功能的方法 使用 Vue 实现单据功能通常涉及表单设计、数据绑定、验证和提交等环节。以下是具体实现方案: 表单设计与数据绑定 使用 Vue 的 v-model 指令实现表单数据的双向…