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

VIP/
你想知道在 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.本文部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责。
2.若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
3.如果本站有侵犯、不妥之处的资源,请在网站右边客服联系我们。将会第一时间解决!
4.本站所有内容均由互联网收集整理、网友上传,仅供大家参考、学习,不存在任何商业目的与商业用途。
5.本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
6.不保证任何源码框架的完整性。
7.侵权联系邮箱:aliyun6168@gail.com / aliyun666888@gail.com
8.若您最终确认购买,则视为您100%认同并接受以上所述全部内容。

免费源码网 建站教程 Vue 3 中 `computed` 如何实现可写的计算属性? https://svipm.com.cn/21152.html

相关文章

猜你喜欢