当前位置:首页 > VUE

vue中computed实现原理

2026-01-21 05:42:38VUE

Vue中computed的实现原理

computed属性是Vue的核心特性之一,它基于响应式依赖进行缓存,仅在相关依赖发生改变时才会重新计算。

依赖收集与缓存机制

computed属性通过Object.definePropertyProxy(Vue 3)定义在组件实例上。初始化时创建一个Watcher实例,设置lazy标志为true表示惰性求值。

当首次访问computed属性时,会执行getter函数并触发依赖收集。Vue的响应式系统会记录哪些响应式数据被访问过,建立依赖关系。计算结果的缓存存储在Watcher实例的value属性中。

惰性更新策略

后续访问computed属性时,若依赖未变化则直接返回缓存值。当依赖数据发生变化时,标记computed为"dirty"状态,但不会立即重新计算。直到下次访问该属性时才会执行实际计算,这种延迟更新机制优化了性能。

与watch的区别

computed自动追踪依赖关系,而watch需要显式指定监听目标。computed适合派生状态,watch适合执行副作用操作。computed具有缓存特性,watch每次触发都会执行回调。

源码层面的关键实现

Vue 2.x版本中核心实现位于src/core/instance/state.js

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,
      noop,
      { lazy: true }
    )

    defineComputed(vm, key, userDef)
  }
}

Vue 3使用computed函数和effect实现,基于Proxy的响应式系统:

function computed(getterOrOptions) {
  let getter, setter

  if (isFunction(getterOrOptions)) {
    getter = getterOrOptions
    setter = NOOP
  } else {
    getter = getterOrOptions.get
    setter = getterOrOptions.set
  }

  return new ComputedRefImpl(getter, setter)
}

性能优化要点

避免在computed中进行高开销操作,确保纯函数特性。合理设计依赖关系,防止不必要的重新计算。对于复杂计算可考虑使用memorization技术进一步优化。

vue中computed实现原理

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

相关文章

项目基于vue实现

项目基于vue实现

基于Vue实现项目的关键方法 搭建基础环境 安装Node.js和npm/yarn,确保开发环境具备运行Vue的能力。通过Vue CLI快速初始化项目结构,选择所需配置(如Babel、Router、Vu…

vue如何实现到期提醒

vue如何实现到期提醒

实现 Vue 到期提醒功能 使用计算属性计算剩余时间 在 Vue 组件中定义一个计算属性,计算目标日期与当前日期的差值。通过 Date 对象获取时间戳并计算剩余天数或小时数。 computed: {…

vue实现放大镜原理

vue实现放大镜原理

Vue 实现放大镜效果 放大镜效果常见于电商网站的商品展示,通过鼠标悬停或移动实现局部放大。以下是基于 Vue 的实现方法: 核心原理 布局结构:主容器包含小图区域和放大镜区域。 事件监听:…

vue实现一个标签选择

vue实现一个标签选择

Vue 标签选择组件实现 基础实现 使用 Vue 的 v-for 和 v-model 指令可以快速实现标签选择功能: <template> <div class="tag-s…

vue 实现

vue 实现

Vue 实现的基本步骤 安装 Vue.js 可以通过 npm 或 CDN 引入。使用 npm 安装适合大型项目,CDN 适合快速原型开发。 npm install vue 在 HTML 文件中引入…

vue实现钟表

vue实现钟表

使用 Vue 实现动态钟表 以下是一个基于 Vue 3 的动态钟表实现方案,包含时分秒指针和数字时间显示。 模板部分 <template> <div class="clock…