当前位置:首页 > 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实现aop切面

vue实现aop切面

Vue 实现 AOP 切面编程的方法 在 Vue 中实现 AOP(面向切面编程)可以通过多种方式,以下是几种常见的实现方法: 使用 Vue 混入(Mixins) Vue 的混入机制可以用于实现横切关…

vue前端实现下载进度

vue前端实现下载进度

实现下载进度条的基本思路 在Vue中实现下载进度条,通常需要结合XMLHttpRequest或Fetch API来监听下载进度事件。通过计算已下载数据与总数据的比例,动态更新进度条的显示。 使用XM…

vue实现方法

vue实现方法

Vue 实现方法 Vue 是一种流行的前端框架,用于构建用户界面和单页应用。以下是几种常见的 Vue 实现方法: 创建 Vue 实例 通过 new Vue() 创建一个 Vue 实例,传入配置对象,…

vue拖拽实现

vue拖拽实现

Vue 拖拽实现方法 使用 HTML5 原生拖拽 API HTML5 提供了原生拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 drop 事…

vue代理实现

vue代理实现

Vue 代理实现方法 在 Vue 项目中,配置代理可以解决开发环境下的跨域问题,通常通过修改 vue.config.js 文件实现。以下是几种常见的代理配置方式: 基础代理配置 在 vue.conf…

vue实现标题

vue实现标题

Vue 实现标题的方法 在Vue中实现标题可以通过多种方式,以下是几种常见的方法: 方法一:使用模板语法 在Vue组件的模板中直接使用HTML的<h1>到<h6>标签来定义…