当前位置:首页 > VUE

vue computed实现机制

2026-02-18 11:28:57VUE

Vue computed 实现机制

Vue 的 computed 属性是基于响应式依赖的缓存机制,其核心实现依赖于 Vue 的响应式系统和依赖收集。

依赖收集与响应式

Vue 通过 Object.definePropertyProxy(Vue 3)劫持数据的访问和修改。当计算属性被访问时,会触发其 getter 函数,此时 Vue 会将当前计算属性和其依赖的响应式数据建立关联。

// 伪代码:计算属性初始化
function initComputed(vm, computed) {
  const watchers = {};
  for (const key in computed) {
    const getter = computed[key];
    watchers[key] = new Watcher(vm, getter, { lazy: true });
    defineComputed(vm, key, watchers[key]);
  }
}

缓存机制

计算属性会缓存计算结果,只有当其依赖的响应式数据发生变化时,才会重新计算。这是通过 dirty 标志实现的:

  • 初次访问时,计算属性会执行计算并缓存结果。
  • 依赖数据变化时,标记 dirtytrue,下次访问时重新计算。
  • 未变化时直接返回缓存值。
// 伪代码:计算属性 getter
function createComputedGetter(key) {
  return function computedGetter() {
    const watcher = this._computedWatchers[key];
    if (watcher.dirty) {
      watcher.evaluate(); // 重新计算
    }
    if (Dep.target) {
      watcher.depend(); // 收集依赖
    }
    return watcher.value;
  };
}

与 Watch 的区别

  • computed 是惰性求值,依赖变化时才重新计算。
  • watch 是主动监听,适合执行副作用(如异步操作)。
  • computed 必须有返回值,watch 不需要。

性能优化

  • 避免在计算属性中执行耗时操作。
  • 减少不必要的依赖,拆分复杂计算属性。
  • Vue 3 的 computed 基于 Proxy 优化了依赖追踪效率。

实现流程总结

  1. 初始化阶段,为每个计算属性创建独立的 Watcher
  2. 访问计算属性时触发 getter,进行依赖收集。
  3. 依赖变化时标记 dirty,下次访问时重新计算。
  4. 无变化时直接返回缓存值,避免重复计算。

vue computed实现机制

标签: 机制vue
分享给朋友:

相关文章

vue实现选中单元格

vue实现选中单元格

Vue 实现选中单元格的方法 基础实现思路 在 Vue 中实现选中单元格功能,通常可以通过动态绑定 class 或 style 来实现。以下是一个基于表格的简单实现示例: <templ…

vue实现星星

vue实现星星

实现星星评分的Vue组件 使用Vue实现星星评分功能可以通过组件化方式完成,以下是一个完整的实现方案: 模板部分 <template> <div class="star-…

vue实现高亮

vue实现高亮

Vue 实现文本高亮的方法 在 Vue 中实现文本高亮可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 v-html 指令 通过 v-html 指令可以动态插入 HTML 内容,将需…

vue实现级联

vue实现级联

Vue 实现级联选择器的方法 级联选择器(Cascader)是常见的表单组件,用于处理多层级联动数据选择(如省市区选择)。以下是几种实现方式: 基于 Element UI 的 el-cascader…

vue 实现关闭

vue 实现关闭

Vue 实现关闭功能的方法 在Vue中实现关闭功能通常涉及组件销毁、模态框隐藏或路由跳转等场景。以下是几种常见实现方式: 销毁当前组件 使用v-if或v-show控制组件显示/隐藏,适用于局部组件:…

vue实现模块

vue实现模块

Vue 实现模块化的方法 Vue 支持多种模块化开发方式,可以根据项目需求选择适合的方案。 使用单文件组件(SFC) 单文件组件是 Vue 最常用的模块化方式,将模板、脚本和样式封装在一个 .vue…