vue 3 中计算属性 setter 需用 computed({ get, set }) 形式,返回可双向绑定的 ref 对象;必须通过 .value 操作 ref 值,支持 v-model 直接使用。

Vue 的计算属性默认只有 getter,但通过添加 setter,可以实现数据的双向拦截——既响应式读取,又拦截赋值并执行自定义逻辑。这在封装表单组件、同步父子状态或做数据格式转换时特别实用。
计算属性 Setter 的基本写法
要为计算属性添加 setter,必须将它声明为对象形式,包含 get 和 set 两个函数:
- get:返回计算后的值(必须有)
- set:接收一个参数(即被赋的新值),用于处理写入逻辑(可选)
示例(Vue 2 / Vue 3 Options API):
computed: {
fullName: {
get() {
return this.firstName + ' ' + this.lastName;
},
set(newValue) {
const parts = newValue.split(' ');
this.firstName = parts[0] || '';
this.lastName = parts[1] || '';
}
}
}
当执行 this.fullName = '张三' 时,setter 会被触发,自动拆分并更新 firstName 和 lastName。
分析 Vue 3 Composition API 使用情况——审计响应式模式、可组合函数设计、ref 与 reactive 的选择、计算属性、watcher 使用及组件……
Vue 3 Composition API 中怎么写?
在 setup() 或 script setup 中,使用 computed 函数传入一个对象:
import { computed, ref } from 'vue';
const firstName = ref('李');
const lastName = ref('四');
const fullName = computed({
get() {
return firstName.value + ' ' + lastName.value;
},
set(value) {
const [first = '', last = ''] = value.split(' ');
firstName.value = first;
lastName.value = last;
}
});
注意:必须用 .value 访问 ref 的值;computed({ get, set }) 返回的是一个带有 getter/setter 的 ref 对象,可直接在模板中双向绑定(如 v-model="fullName")。
Setter 的典型应用场景
- 格式化输入:如把用户输入的手机号自动加空格或横线,setter 中标准化后存入原始字段
-
父子通信封装:子组件用计算属性包装
props和emit,让父组件像操作普通数据一样使用v-model - 派生状态同步:多个底层字段共同决定一个高级状态(如“是否有效”),setter 反向控制底层字段的合法性
例如封装一个带校验的输入框,计算属性 setter 可拦截输入、过滤非法字符,并触发验证逻辑。
注意事项和常见坑
- setter 中不要直接修改计算属性本身(会无限循环),只改依赖的响应式源数据
- 如果 getter 报错或返回 undefined,setter 仍可执行,但可能引发意外行为,建议做好防御性判断
- Vue 2 中计算属性 setter 无法在 template 模板中直接触发(需配合
v-model或手动赋值),而 Vue 3 的computed({ get, set })支持完整 v-model 协议 - 避免在 setter 中执行异步操作(如 await API),因为 v-model 是同步响应的,异步赋值会导致视图滞后或状态不一致
掌握 setter 写法,就能让计算属性从“只读管道”升级为“智能双向代理”,真正实现数据流的可控与可扩展。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









