计算属性的setter是用于拦截对计算属性赋值操作的自定义逻辑,必须与getter同时声明,通过拆解新值并写入原始响应式数据实现双向绑定控制。
Vue 的计算属性默认只有 getter,但你可以通过添加 setter 实现“可写”的计算属性,从而在数据被修改时触发自定义逻辑——这正是实现双向拦截的关键一步。
计算属性通常用于派生值(比如拼接姓名、格式化日期),它基于响应式依赖自动更新。而 setter 允许你在外部试图给该计算属性赋值时,执行你指定的操作,而不是直接改写值。它不改变原始数据的响应性,而是提供一个“拦截入口”。
注意:必须同时声明 get 和 set,否则会报错;且 setter 中不能直接给计算属性自身赋值(会造成无限循环)。
在 computed 选项中,用对象语法定义:
立即学习“前端免费学习笔记(深入)”;
computed: { fullName: { get() { return this.firstName + ' ' + this.lastName; }, set(newValue) { const parts = newValue.split(' '); this.firstName = parts[0] || ''; this.lastName = parts[1] || ''; } }}
vm.fullName = '张三'),然后拆解并写入原始数据(firstName/lastName)v-model="fullName" 就能实现“看起来双向”,实则由你控制写入逻辑在 setup() 或 computed() 函数中,同样支持传入 getter/setter 对象:
import { ref, computed } from 'vue'export default { setup() { const firstName = ref('李') const lastName = ref('四') const fullName = computed({ get() { return firstName.value + ' ' + lastName.value }, set(newValue) { const parts = newValue.split(' ') firstName.value = parts[0] || '' lastName.value = parts[1] || '' } }) return { fullName } }}
computed({ get, set }) 返回的是一个带 .value 的 ref-like 响应式对象<input v-model="fullName">
Setter 不只是“拆字符串”,更是拦截和转换的入口。例如处理价格输入:
"¥1,234.50" → setter 清洗为数字 1234.5 存入 priceRaw
v-model,就能让表单既友好又可控这种模式避免了在每个 @input 里重复写清洗逻辑,把转换与校验收敛到计算属性内部。
阿里云百炼Token Plan和Coding Plan省钱订阅计划:如何选择?有哪些区别?
最新:阿里云万小智收费价格:活动15元1个月:180元1年:轻量版、标准版及高级版功能支持
移动端的AI助手不应只是客服窗口:更应借助AI能力将小程序服务变成可调用能力
AI搜索引用到客户咨询:中间隔着三层数据漏斗
【码道代码智能体】码道界面焕新:AI 懂需求 开发更顺手
CodexBar:把 AI 编码额度接入 macOS 菜单栏