当前位置:首页 > 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 实现访问量统计的方法 使用前端计数 在 Vue 中可以通过简单的计数器实现页面访问量的统计。这种方法适合小型项目或演示用途。 // 在 Vue 组件中 data() { return {…

vue实现流程

vue实现流程

Vue 实现流程的基本步骤 安装 Vue.js 可以通过 CDN 引入或使用 npm/yarn 安装。 CDN 方式: <script src="https://cdn.jsdelivr.…

vue实现键盘

vue实现键盘

Vue 实现键盘功能 在Vue中实现键盘功能通常涉及监听键盘事件、处理输入以及渲染虚拟键盘界面。以下是几种常见的实现方式: 监听键盘事件 通过@keydown或@keyup指令监听键盘事件,适用于需…

vue实现频道

vue实现频道

Vue实现频道功能的方法 使用Vue Router动态路由 通过Vue Router的动态路由功能可以轻松实现频道切换。在路由配置中定义动态参数,组件内通过this.$route.params获取当前…

vue 实现脚本

vue 实现脚本

Vue 实现脚本的方法 Vue.js 提供了多种方式来实现脚本功能,包括组件内脚本、混入(Mixins)、插件(Plugins)以及自定义指令等。以下是常见的实现方式: 组件内脚本 在 Vue 单文…

vue实现换页

vue实现换页

Vue实现页面切换的方法 在Vue中实现页面切换通常可以通过Vue Router来完成。Vue Router是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。以下是几种常见的实现方式:…