前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库Vue computed 和 methods 缓存区别
VuVue响应式原理

Vue 的 computed 和模板里调用方法都能派生值,什么输入下 computed 的缓存才是决定性优势?

computed 的价值是复用基于响应式依赖的派生结果;是否值得缓存,要看计算成本、读取次数和依赖变化频率。

前端进阶之旅 · 一题精讲更新于 2026.09.06
Vue#响应式原理#缓存
先看核心答案
理解线索

依赖变化、结果读取与实际计算分开观察

  1. 追踪计算时实际读取的响应式值形成依赖
  2. 复用没有相关变化时重复读取可使用缓存结果
  3. 失效相关依赖变化后,后续读取需得到最新派生值

不要用更新次数的绝对口号推断性能,应结合实际计算与消费路径测量。

核心回答

先记住这个答案

computed 根据计算过程中读取的响应式依赖缓存结果,在依赖未改变时重复读取可以复用结果。模板里的普通方法调用则在对应渲染表达式执行时重新运行。计算昂贵、被多处读取且依赖变化相对少时,computed 更有意义;需要不同参数、执行用户动作或成本很低的逻辑不必一律改成 computed。其 getter 应保持纯粹,也不能依赖没有响应式来源的时间值自动刷新。

  • 缓存是否可复用由响应式依赖决定
  • 模板方法在对应表达式执行时运行
  • computed getter 负责派生值,不承担副作用

同一份筛选结果被多处读取时的差异

假设商品页面同时展示符合条件的商品列表、数量和总价。如果每个区域都调用同一个筛选方法,相关渲染表达式执行时可能重复遍历输入。将筛选结果定义为 computed,可以把同一组依赖下的结果作为统一派生值供多个位置读取,减少重复计算和规则分散。

如果列表很小、方法只做一个简单格式化,缓存收益可能并不明显。还要看依赖是否每次交互都改变:搜索词每次输入都变化时,筛选结果当然需要更新。computed 能复用未失效的结果,不能消除业务上本来必须执行的计算,也不能保证巨量列表渲染没有其它瓶颈。

带不同参数的试算不等于一个计算属性

假设页面允许分别试算折扣百分比,输入参数来自用户点击的多个预设。普通函数接收商品与折扣参数会更清晰;computed 本身不是为任意参数组合自动维护多份缓存的通用函数。如果它返回一个函数,也不能因此断言那个函数每次调用的结果都被 computed 分参数记忆了。

相反,当“当前选中的折扣比例”已经保存在响应式状态中,最终价格就是这个比例与商品价格的派生结果,此时 computed 很自然。应先决定参数是本次操作的输入,还是持续驱动界面的状态,再决定函数与计算属性的位置,避免为了使用缓存而扭曲数据模型。

时间、异步请求和原地修改带来的误判

computed 中只读取 Date.now 不会建立一个会随时间流逝触发更新的响应式依赖。想展示时钟,需要有明确更新的响应式时间状态,并按生命周期管理定时器。外部普通变量和绕过代理的变化也不能被当成 Vue 已经追踪到的依赖。

getter 应只根据输入产生结果,不应在里面发请求、修改其它 state 或改变 DOM。异步请求的加载、失败、取消和竞态需要独立建模。对输入数组排序等操作也应避免原地修改源数据;如果派生计算改变了自己的输入,调试时就很难再清楚区分是什么变化导致重新计算。

回答前,多想一步

容易答错的地方

认为 methods 每一帧都会执行
方法执行取决于是否实际调用。模板中使用的方法会随着相关渲染表达式执行,而不是浏览器每一帧无条件运行;普通事件方法则通常在相应事件发生时运行。
认为 computed 缓存能修复错误的依赖来源
缓存需要基于响应式依赖才能正确失效。非响应式输入、代理之外的修改或错误引用不会因为包上一层 computed 就自动变成可靠的数据更新通道。
试着用自己的话回答

面试官还会怎么问?

依赖变化后 computed 是否必须立即执行 getter?

不要把失效与每个时点的实际求值混为一谈。computed 通常按读取需求提供最新值,具体通知与优化还受框架版本影响;业务上应依赖结果正确,而不是利用 getter 执行次数安排副作用。

可以在 computed 里调用纯工具函数吗?

可以。依赖追踪关注计算期间发生的响应式读取,纯工具函数也可以参与计算。应保证函数不写外部状态,并让输入与输出的关系清晰,便于单独验证算法。

只想格式化当前行一个金额,有必要 computed 吗?

不一定。简单格式化函数通常足够,尤其是需要接收每行不同金额时。只有出现明确重复计算成本,或该派生值本身需要被多处持续消费,才值得进一步设计缓存方式。

从一道题,走向一组知识

把知识连起来

响应式原理

Vue 3 的 reactive 为什么改用 Proxy,而不是继续用 Vue 2 的 Object.defineProperty?

computed 依赖响应式读取,继续理解代理拦截与依赖收集的关系。

响应式原理

Vue 3.5 的 <script setup> 中解构 props 为什么还能保持响应式,和普通 reactive 解构有何不同?

如果 computed 使用来自 props 的解构变量,还需确认是否处于支持转换的编译作用域。

参考资料

  • Vue Computed Properties

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 同一份筛选结果被多处读取时的差异
  3. 带不同参数的试算不等于一个计算属性
  4. 时间、异步请求和原地修改带来的误判
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑