当前位置:首页 > VUE

vue computed实现机制

2026-03-10 00:43:09VUE

Vue computed 实现机制

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

依赖收集与触发

computed 属性在初始化时会创建一个 Watcher 实例,并标记为 lazy(惰性求值)。当首次访问 computed 属性时,会执行其 getter 函数,触发依赖收集。此时,所有在 getter 中访问的响应式数据(如 dataprops)会被记录为依赖。

vue computed实现机制

// 伪代码:Watcher 的初始化
new Watcher(vm, getter, { lazy: true });

缓存机制

computed 属性会缓存计算结果。只有当其依赖的响应式数据发生变化时,才会重新计算。否则直接返回缓存值。这一机制通过 dirty 标志位实现:

vue computed实现机制

  • 初始时 dirty = true,表示需要重新计算。
  • 计算完成后 dirty = false,后续访问直接返回缓存值。
  • 依赖变化时,dirty 被设为 true,触发下次访问时重新计算。

惰性求值

computed 的求值是惰性的,即只有在模板或代码中实际访问时才会计算。这与 methodswatch 的即时执行不同。

实现流程

  1. 初始化阶段:Vue 遍历 computed 对象,为每个属性创建对应的 Watcher,并绑定 getter
  2. 首次访问:触发 getter,执行依赖收集,计算结果并缓存。
  3. 依赖更新:当依赖数据变化时,通知 computed Watcher 标记 dirtytrue
  4. 重新计算:下次访问时,若 dirtytrue,则重新计算并更新缓存。

代码示例

以下是一个简化的 computed 实现逻辑:

class Watcher {
  constructor(vm, expOrFn, options) {
    this.vm = vm;
    this.lazy = !!options.lazy;
    this.dirty = this.lazy;
    this.getter = expOrFn;
    this.value = this.lazy ? undefined : this.get();
  }

  get() {
    pushTarget(this); // 标记当前 Watcher 为依赖收集目标
    const value = this.getter.call(this.vm);
    popTarget(); // 恢复之前的 Watcher
    return value;
  }

  update() {
    if (this.lazy) {
      this.dirty = true; // 标记为需要重新计算
    } else {
      this.get();
    }
  }
}

watch 的区别

  • computed 是计算属性,适用于派生状态;watch 是监听机制,适用于副作用操作。
  • computed 自动追踪依赖,watch 需显式指定监听目标。
  • computed 具有缓存,watch 每次触发都会执行回调。

通过这种机制,Vue 的 computed 实现了高效、自动化的依赖管理和缓存优化。

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

相关文章

vue项目实现

vue项目实现

Vue 项目实现指南 环境准备 确保已安装 Node.js(建议版本 14+)和 npm/yarn。通过以下命令检查版本: node -v npm -v 安装 Vue CLI(脚手架工具): np…

vue 实现jqslidedown

vue 实现jqslidedown

在 Vue 中实现类似 jQuery 的 slideDown 效果,可以通过 Vue 的过渡系统或 CSS 动画结合动态样式绑定来实现。以下是几种实现方式: 使用 Vue Transition 组件…

vue实现popup

vue实现popup

Vue 实现 Popup 弹窗 使用 Vue 原生组件 创建一个基本的 Vue 组件作为弹窗,通过 v-if 或 v-show 控制显示隐藏。 <template> <div&…

vue 实现href

vue 实现href

Vue 实现 href 的方法 在 Vue 中实现 href 功能可以通过多种方式,具体取决于需求场景。以下是几种常见的方法: 使用 <a> 标签 直接使用 HTML 的 <a&g…

vue工序实现

vue工序实现

Vue 工序实现方法 在Vue中实现工序(或流程)功能,通常涉及状态管理、组件通信和动态渲染。以下是几种常见方法: 使用动态组件 通过Vue的<component :is="currentCo…

vue实现抽屉

vue实现抽屉

Vue 实现抽屉组件 抽屉组件是一种常见的 UI 模式,通常用于从屏幕边缘滑出内容。以下是几种实现抽屉的方法: 使用 Vue 原生实现 创建一个基本的抽屉组件,利用 Vue 的过渡和条件渲染功能。…