当前位置:首页 > VUE

vue computed实现原理

2026-01-18 01:35:19VUE

Vue computed 实现原理

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

初始化阶段

在 Vue 实例初始化时,computed 属性会被遍历并转化为 getter/setter。每个 computed 属性会创建一个对应的 Watcher 实例,标记为 lazy watcher(惰性求值)。初始化时不会立即计算值,而是在首次访问时才会触发计算。

function initComputed(vm, computed) {
  const watchers = vm._computedWatchers = Object.create(null);
  for (const key in computed) {
    const getter = typeof computed[key] === 'function' 
      ? computed[key] 
      : computed[key].get;
    watchers[key] = new Watcher(vm, getter, noop, { lazy: true });
    defineComputed(vm, key, computed[key]);
  }
}

依赖收集

当首次访问 computed 属性时,会触发 getter 函数。此时会执行 watcher.evaluate() 进行求值。在求值过程中,computed 属性所依赖的响应式数据(data/props)会被收集为依赖。这些依赖的 Dep 会将当前 computed watcher 添加到订阅列表中。

function createComputedGetter(key) {
  return function computedGetter() {
    const watcher = this._computedWatchers[key];
    if (watcher.dirty) {
      watcher.evaluate();
    }
    if (Dep.target) {
      watcher.depend();
    }
    return watcher.value;
  };
}

缓存机制

computed 属性具有缓存特性,只有当其依赖的响应式数据发生变化时才会重新计算。这是通过 watcher.dirty 标志位控制的。依赖数据变化时,会通知 computed watcher 将 dirty 设为 true,下次访问时重新计算。

更新触发

当 computed 依赖的响应式数据发生变化时,会触发依赖更新流程。computed watcher 会被标记为 dirty,但不会立即重新计算。只有在下次访问该 computed 属性时才会执行重新计算,这种惰性更新机制优化了性能。

与 methods 的区别

computed 属性是基于它们的响应式依赖进行缓存的,只有在相关依赖发生改变时才会重新求值。而 methods 方法每次调用都会执行函数体。对于需要复杂计算且依赖不变的情况,computed 性能更优。

与 watch 的区别

watch 更适用于在数据变化时执行异步或开销较大的操作,而 computed 更适合同步计算派生值。computed 会自动追踪依赖,而 watch 需要明确指定监听的对象。

vue computed实现原理

标签: 原理vue
分享给朋友:

相关文章

vue实现评论

vue实现评论

Vue 实现评论功能的方法 基础评论组件结构 使用 Vue 单文件组件(SFC)构建评论功能的核心结构。模板部分包含评论输入框和评论列表,脚本部分处理数据绑定和逻辑。 <template&g…

vue实现按钮刷新

vue实现按钮刷新

Vue 实现按钮刷新功能 在 Vue 中实现按钮刷新功能可以通过多种方式实现,具体取决于刷新需求是局部刷新还是全局刷新。以下是几种常见的方法: 使用 window.location.reload(…

vue搜索过后实现分页

vue搜索过后实现分页

Vue 实现搜索后分页功能 数据绑定与搜索逻辑 在 Vue 组件中定义必要的数据属性: data() { return { searchQuery: '', currentPag…

vue动态组建实现原理

vue动态组建实现原理

Vue 动态组件的实现原理 Vue 的动态组件主要通过 component 标签和 is 属性实现,核心原理涉及组件的动态切换和渲染机制。 动态组件的实现方式 使用 component 标签和…

vue手写签名如何实现

vue手写签名如何实现

实现手写签名的基本思路 在Vue中实现手写签名功能,通常需要借助HTML5的Canvas API来捕获用户的绘制操作。核心流程包括初始化画布、监听触摸/鼠标事件、记录轨迹以及生成签名图片。 安装依…

vue实现关键词轮播

vue实现关键词轮播

Vue 实现关键词轮播 基础实现方案 使用 Vue 的 v-for 和 setInterval 实现基础轮播效果: <template> <div class="keyword…