Vue 3 中 `computed` 如何实现可写的计算属性?

你想知道在 Vue 3 中如何把 computed 计算属性设置为可写的,而不是默认的只读状态,对吧?

可写计算属性的实现方式

Vue 3 的 computed 默认是只读的,要实现可写的计算属性,需要给 computed 传入一个包含 get(读取)和 set(设置)方法的对象,而不是单一的回调函数。

完整代码示例

vue
<template>
  <div>
    <!-- 直接修改可写计算属性 -->
    <input v-model="fullName" placeholder="输入全名" />
    <p>姓:{{ firstName }}</p>
    <p>名:{{ lastName }}</p>
    <p>全名(可写):{{ fullName }}</p>
  </div>
</template>

<script setup>
import { ref, computed } from 'vue'

// 基础响应式数据
const firstName = ref('张')
const lastName = ref('三')

// 可写的计算属性
const fullName = computed({
  // get 方法:读取计算属性时触发,返回计算后的值
  get() {
    return `${firstName.value}${lastName.value}`
  },
  // set 方法:修改计算属性时触发,接收修改后的值作为参数
  set(newValue) {
    // 自定义逻辑:把传入的全名拆分为姓和名
    const [newFirst, newLast] = newValue.split('')
    // 更新基础响应式数据
    if (newFirst) firstName.value = newFirst
    if (newLast) lastName.value = newLast
  }
})
</script>

代码关键解释

  1. get 方法
    • 当读取 fullName 时自动触发,逻辑和普通只读计算属性一致,返回基于基础数据计算后的值。
    • 这里的逻辑是把 firstNamelastName 拼接成全名。
  2. set 方法
    • 当尝试修改 fullName(比如通过 v-model 输入、直接赋值 fullName.value = '李四')时触发。
    • 接收一个参数 newValue,表示修改后的值,你可以在这个方法里自定义逻辑,把新值拆解后更新底层的响应式数据(firstName/lastName)。
  3. 使用场景
    • 比如表单中需要 “合并 / 拆分” 数据的场景(如示例中的全名拆分)、联动修改多个响应式数据的场景。

测试效果

  • 初始显示:全名是 “张三”;
  • 在输入框中输入 “李四”,set 方法会触发,拆分出 “李” 和 “四”,分别更新 firstNamelastName
  • 页面上的 “姓”“名”“全名” 会同步更新为 “李”“四”“李四”。

总结

  1. 可写计算属性需要给 computed 传入包含 getset 的对象,而非单一函数;
  2. get 负责返回计算后的值(只读逻辑),set 负责接收新值并更新底层响应式数据;
  3. 修改可写计算属性时(如 xxx.value = 新值v-model),会触发 set 方法,而非直接修改计算属性本身。

免责声明:
1.本站所有源码支持免费互换,所有资源来源于网络,分享目的仅供大家学习和交流!不得使用于非法商业用途,不得违反国家法律。否则后果自负!(下载即表示同意遵守此条例!) 所有资源,不能保证完全去除后门和源码的完整性!(建议先用D盾 等查杀软件先扫描一遍!)且都不包含技术服务请大家谅解!
2.根据二○○二年一月一日《计算机软件保护条例》规定:为了学习和研究软件内含的设计思想和原理, 通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可, 不向其支付报酬!鉴于此,也希望大家按此说明研究!
3.本站所有源码均收集来源于网络,若此源码资源等文章侵犯您的合法权益,请私信联系站长,并于24小时内删除下架。
4.本站所有源码仅限学习,交流使用,请勿上线或非法使用,一切法律责任均于此站无关。
5.侵权联系邮箱:188773464@qq.com
6.若您最终确认购买,则视为您100%认同并接受以上所述全部内容。

源码下载网 技术社区 Vue 3 中 `computed` 如何实现可写的计算属性? https://svipm.com.cn/21152.html

相关文章

猜你喜欢