当前位置:首页 > VUE

vue computed 实现

2026-03-07 00:05:34VUE

Vue computed 实现原理

Vue 的 computed 属性是基于响应式依赖进行缓存的计算属性。其核心实现依赖于 Vue 的响应式系统和 Watcher 机制。

基本实现原理

computed 属性初始化时会创建一个 lazy Watcher。这个 Watcher 不会立即求值,只有在真正被访问时才会计算。计算过程中会收集依赖的响应式数据,当这些依赖发生变化时,标记 computed 属性为脏状态(dirty),下次访问时重新计算。

关键实现步骤

  1. 初始化阶段
    在组件初始化时,Vue 会遍历 computed 对象,为每个 computed 属性创建一个 Watcher 实例。这个 Watcher 的 lazy 选项设置为 true,表示延迟计算。

  2. 依赖收集
    当首次访问 computed 属性时,触发 getter 函数执行计算。计算过程中访问的响应式属性会被记录为依赖。

    vue computed 实现

  3. 缓存机制
    计算完成后,结果会被缓存。只要依赖没有变化,后续访问直接返回缓存值,避免重复计算。

  4. 依赖更新
    当依赖的响应式数据发生变化时,标记 computed 为 dirty 状态。下次访问时会重新计算并更新缓存。

    vue computed 实现

示例代码实现

class Dep {
  constructor() {
    this.subscribers = new Set()
  }
  depend() {
    if (activeEffect) {
      this.subscribers.add(activeEffect)
    }
  }
  notify() {
    this.subscribers.forEach(effect => effect())
  }
}

let activeEffect = null

function watchEffect(effect) {
  activeEffect = effect
  effect()
  activeEffect = null
}

class ComputedRef {
  constructor(getter) {
    this._dirty = true
    this._value = undefined
    this._getter = getter
    this.effect = () => {
      if (!this._dirty) {
        this._dirty = true
      }
    }
    watchEffect(this.effect)
  }

  get value() {
    if (this._dirty) {
      this._value = this._getter()
      this._dirty = false
    }
    return this._value
  }
}

function computed(getter) {
  return new ComputedRef(getter)
}

使用示例

const count = { value: 0 }
const double = computed(() => count.value * 2)

console.log(double.value) // 0
count.value++
console.log(double.value) // 2

性能优化点

  1. 惰性求值
    computed 属性只有在被访问时才会计算,避免不必要的计算开销。

  2. 缓存机制
    依赖未变化时直接返回缓存值,减少重复计算。

  3. 智能依赖追踪
    自动追踪计算过程中用到的响应式数据,精确控制更新时机。

与 methods 的区别

computed 属性是基于它们的响应式依赖进行缓存的,只有在相关依赖发生改变时才会重新求值。而 methods 调用总会执行函数,没有缓存机制。

标签: vuecomputed
分享给朋友:

相关文章

vue实现滚动截屏

vue实现滚动截屏

实现滚动截屏的基本思路 滚动截屏通常指对超出可视区域的长页面进行完整截图。在Vue中,可以通过结合DOM操作、Canvas绘制及第三方库实现。以下是具体方法: 使用html2canvas库实现 安装…

vue 实现级联

vue 实现级联

Vue 实现级联选择器 级联选择器(Cascader)常用于省市区选择、分类选择等场景。Vue 中可以通过 Element UI、Ant Design Vue 等 UI 库实现,也可以手动封装。 使…

vue实现oauth

vue实现oauth

Vue 实现 OAuth 的步骤 安装必要的依赖 确保项目中安装了 axios 和 vue-router。OAuth 通常需要发送 HTTP 请求和处理路由跳转。 npm install axios…

vue实现popper

vue实现popper

Vue 实现 Popper 的方法 使用 Tippy.js 库 Tippy.js 是一个轻量级的 Popper.js 封装库,提供丰富的工具提示功能。安装 Tippy.js 及其 Vue 封装: n…

vue实现尺子

vue实现尺子

Vue 实现尺子组件 实现一个尺子组件可以通过 Canvas 或纯 CSS 完成。以下是两种常见实现方式: 使用 Canvas 绘制尺子 通过 Canvas 动态绘制刻度线和数字,适合需要高精度或动…

vue实现select

vue实现select

Vue 实现 Select 组件的方法 在 Vue 中实现 Select 组件可以通过多种方式完成,以下是几种常见的方法: 使用原生 HTML select 元素 原生 HTML 的 <sel…