一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Vue计算属性怎么写 Setter:教你如何实现组件数据的双向拦截

时间:2026-06-17 09:55:47 编辑:袖梨 来源:一聚教程网

计算属性的setter是用于拦截对计算属性赋值操作的自定义逻辑,必须与getter同时声明,通过拆解新值并写入原始响应式数据实现双向绑定控制。

Vue 的计算属性默认只有 getter,但你可以通过添加 setter 实现“可写”的计算属性,从而在数据被修改时触发自定义逻辑——这正是实现双向拦截的关键一步。

什么是计算属性的 setter?

计算属性通常用于派生值(比如拼接姓名、格式化日期),它基于响应式依赖自动更新。而 setter 允许你在外部试图给该计算属性赋值时,执行你指定的操作,而不是直接改写值。它不改变原始数据的响应性,而是提供一个“拦截入口”。

注意:必须同时声明 getset,否则会报错;且 setter 中不能直接给计算属性自身赋值(会造成无限循环)。

基础写法:对象形式声明 getter + setter

computed 选项中,用对象语法定义:

立即学习“前端免费学习笔记(深入)”;

computed: {  fullName: {    get() {      return this.firstName + ' ' + this.lastName;    },    set(newValue) {      const parts = newValue.split(' ');      this.firstName = parts[0] || '';      this.lastName = parts[1] || '';    }  }}
  • get() 负责读取时返回什么(如拼接后的全名)
  • set(newValue) 接收用户赋的新值(比如 vm.fullName = '张三'),然后拆解并写入原始数据(firstName/lastName
  • 这样在模板中用 v-model="fullName" 就能实现“看起来双向”,实则由你控制写入逻辑

Vue 3 Composition API 中怎么写?

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 }  }}
  • 和 Options API 逻辑一致,只是写法更函数式
  • computed({ get, set }) 返回的是一个带 .value 的 ref-like 响应式对象
  • 模板中仍可直接绑定:<input v-model="fullName">

实际应用场景:格式化输入 + 数据校验

Setter 不只是“拆字符串”,更是拦截和转换的入口。例如处理价格输入:

  • 用户输入 "¥1,234.50" → setter 清洗为数字 1234.5 存入 priceRaw
  • get 返回格式化后的显示值(带千分位、货币符号)
  • 在 set 里做 isNaN 判断、范围限制、甚至发请求校验库存
  • 配合 v-model,就能让表单既友好又可控

这种模式避免了在每个 @input 里重复写清洗逻辑,把转换与校验收敛到计算属性内部。

热门栏目