前端进阶之旅前端进阶之旅
  • 基础篇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 writable computed get set 读写契约
VuVue响应式原理

Vue 可写 computed 的 get 和 set 应怎样配合,为什么 getter 不能改状态?

get 从权威状态派生值,set 把外部写入转换成明确的源状态更新;computed 本身不是另一份独立存储。

前端进阶之旅 · 一题精讲更新于 2026.09.06
Vue#响应式原理#异步编程#缓存#流处理
先看核心答案读代码示例
理解线索

一次写入如何通过源状态反映到读取

  1. 读取映射根据源状态产生对外展示值
  2. 写入转换将接收到的输入校验并映射回源状态
  3. 再次读取getter 根据已更新来源得出新的展示结果

可写计算不是强制双射;舍入、格式化或拒绝输入可以存在,但必须让调用方知道。

核心回答

先记住这个答案

可写 computed 接收 get 与 set。get 应根据响应式来源纯粹计算结果;给 computed.value 赋值时,会调用 set,由它校验或转换输入并更新真实来源。下一次读取仍由 get 决定,而不是自动保存赋入的原值。两者应共同表达清楚的转换、精度和拒绝规则,使一次写入后的读取符合业务预期。getter 中修改状态或发送请求,会让读取本身产生副作用,破坏缓存和依赖分析。

  • computed 的权威数据仍在来源中,setter 不自动保存值
  • get 保持纯计算,set 明确输入到源状态的转换
  • 允许归一化,但写后读出的结果必须符合可解释规则

用单位换算理解读写映射

假设应用以摄氏温度作为权威来源,却允许用户通过华氏温度编辑。get 负责把摄氏值转换为华氏值,set 则反向转换并更新摄氏来源。computed 不需要再独立保存一份华氏 state,否则就会出现两份数值必须不断同步的问题。

下面示例只演示数值映射,采用有限数检查拒绝无效输入。真实输入框可能产生空字符串和正在编辑的格式,通常应在界面适配层先区分草稿与已确认数字,再交给这个数值接口。单位映射不能自动代替完整的表单编辑协议。

可写计算把输入映射回权威温度TypeScript
import { computed, ref } from 'vue';

const celsius = ref(0);
const fahrenheit = computed({
  get: () => celsius.value * 9 / 5 + 32,
  set: (value: number) => {
    if (Number.isFinite(value)) celsius.value = (value - 32) * 5 / 9;
  }
});

fahrenheit.value = 212;
const afterWrite = { celsius: celsius.value, fahrenheit: fahrenheit.value };
fahrenheit.value = NaN;
const afterInvalid = celsius.value;

Vue 3 中写入 212 后,afterWrite 的摄氏值为 100、华氏值为 212;无效数值被拒绝,afterInvalid 仍为 100。示例只进行本地数值操作,没有控制台输出。

归一化和精度需要成为公开约定

有些 setter 会裁剪空格、限制范围或按精度舍入,因此写入某个值后,get 不一定逐字符返回原输入。只要这符合明确业务规则,就不必强求数学上的一一映射。相反,若界面要求保留用户的未完成输入,就应该有独立编辑草稿,而不是让归一化 getter 不断覆盖它。

setter 也不应该写回同一个 computed.value 形成递归。需要更新的是权威 ref、状态字段或明确的父层更新协议。组件 props 为只读时,可写计算常用于把读取映射到 prop、把写入映射到更新事件;它不能直接把 props 的只读约束变成可写权限。

为什么 getter 中的副作用特别难控制

getter 可能因为读取需要而执行,也可能直接复用缓存,执行次数不是用户动作次数。若在其中发送保存请求、修改其它响应式字段或写入当前源状态,普通读取就会启动外部操作,并可能反过来改变自己的依赖,造成循环或难以预测的更新。

异步保存也不宜伪装成一个赋值就已经完成的同步接口。可以让事件或专门动作负责请求、加载、失败与冲突处理,再更新权威状态;computed 负责读取派生展示。setter 中若必须触发命令,也要明确它不提供自动等待、回滚或去重,调用方不能把赋值返回视为远端保存成功。

回答前,多想一步

容易答错的地方

给 computed 赋值后,Vue 会自动缓存这个新值
赋值调用 setter,后续读取仍通过 getter 和真实来源决定。setter 若没有改变相关来源,展示值可能保持不变,这不一定是响应式失效。
getter 里顺便修正非法来源最方便
读取引发状态修改会让依赖计算与业务校验互相纠缠。应该在输入、更新动作或清楚的校验流程中处理非法状态,让 getter 专注于可重复的纯计算。
试着用自己的话回答

面试官还会怎么问?

只读 computed 返回对象后,里面字段也被深冻结吗?

不能把 computed 的只读赋值入口等同于任意返回对象都被深冻结。派生对象仍不应被调用方随意修改,应通过权威来源表达业务变化,具体只读包装按实际 API 判断。

setter 可以拒绝一个值吗?

可以,但要有可见或可检查的反馈契约。静默拒绝在简单示例中能说明边界,实际表单通常还需要错误提示,避免用户不知道为什么输入没有生效。

可写 computed 适合所有双向表单吗?

不适合。转换明确的派生接口很合适;复杂草稿、撤销、异步提交和冲突处理需要独立状态与动作模型,不能全部塞进一个 setter。

从一道题,走向一组知识

把知识连起来

响应式原理

Vue computed 的缓存什么时候失效,无关状态更新会重新计算吗?

getter 是否重新求值由依赖与读取决定,不能用它承载必须执行的副作用。

响应式原理

Vue toRef 和 toRefs 怎么选择,和 ref(state.field) 有什么区别?

单纯提供字段入口与构造读写转换是不同需求,需要分别选择工具。

参考资料

  • Computed Properties: Writable Computed
  • Reactivity API: Core

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

本题目录
  1. 先记住这个答案
  2. 用单位换算理解读写映射
  3. 归一化和精度需要成为公开约定
  4. 为什么 getter 中的副作用特别难控制
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

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

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