惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
人人都是产品经理
人人都是产品经理
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 【当耐特】
WordPress大学
WordPress大学
Hugging Face - Blog
Hugging Face - Blog
博客园 - 叶小钗
罗磊的独立博客
宝玉的分享
宝玉的分享
月光博客
月光博客
V
V2EX
博客园 - 司徒正美
Vercel News
Vercel News
量子位
Y
Y Combinator Blog
美团技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
Tailwind CSS Blog
博客园 - Franky
小众软件
小众软件
I
InfoQ
A
About on SuperTechFans

姓王者的博客

Linux用户Secure Boot自主维护指南 | 姓王者的博客 MAD Bugs 已经开始——关于信息安全的军备竞赛 | 姓王者的博客 解决钉钉Dingtalk无法在Linux新版内核上启动问题-修复可执行栈错误 | 姓王者的博客 突发:GitHub 正遭受大规模 Issue 赌博广告轰炸 | 姓王者的博客 Ubuntu26.04-beta体验:坚毅浣熊! | 姓王者的博客 fakeclaw装作龙虾发贴吧 | 姓王者的博客 找回12年前的QQ记忆 | 姓王者的博客 在Linux上玩Flash网页游戏-洛克王国 | 姓王者的博客 Copilot将使用交互数据来训练 | 姓王者的博客 重要通知-请更新我的GPG公钥 | 姓王者的博客 为了自由Android | 姓王者的博客 GPL"2,3"事 | 姓王者的博客 短文-对VitePlus的一点🤏小贡献 | 姓王者的博客 Bing收录没了?亲测有效的快速恢复指南 | 姓王者的博客 解决桌面设备二维码快速识别的工具-ClipQR | 姓王者的博客 解决 Nautilus 自定义终端插件安装依赖问题 | 姓王者的博客 OpenClaw 该熄火了 | 姓王者的博客 Vite8 - 统一的基建开始 | 姓王者的博客 Astro 6 推出啦 | 姓王者的博客 ubuntu的openvpn异常暂停推送更新 | 姓王者的博客 Ubuntu 24.04 安装 Win10 虚拟机 | 姓王者的博客 ESA-后记:热爱阿里云 | 姓王者的博客 Moonbit 0.8.0 重大发布,我也要改一下我的包 | 姓王者的博客 ESA Pages 边缘开发大赛获奖 | 姓王者的博客 Astro: 优化katex,mermaid和灯箱使用 | 姓王者的博客 从edgeone迁移到esa | 姓王者的博客 出租人类:AI时代的荒诞与真实 | 姓王者的博客 Astro 5.17构建性能优化实践:从18s到13s | 姓王者的博客 Moonbit License Checker 开发使用 | 姓王者的博客 Stalux Astro博客主题自荐 | 姓王者的博客
Vue:计算属性 | 姓王者的博客
作者:xingwangzhe · 2024-09-29 · via 姓王者的博客

🕒 阅读时间:1 分钟 📝 字数:365 👀 阅读量: Loading...

默认只读

我们为什么需要计算属性

全名:<span>{{firstName + '-' + lastName}}</span><br />

vue官方不建议我们在模板这么写,这看起来过于 复杂

示例代码

<template>

<div class="person">

姓:<input type="text" v-model="firstName" /> <br />

名:<input type="text" v-model="lastName" /> <br />

全名:<span>{{fullName}}</span><br />

<button @click="changeName">修改姓名</button>

<!-- 全名 <span>{{firstName}}-{{lastName}}</span> <br> -->

</div>

</template>

<script setup lang="ts" name="Personsss">

import { computed, ref } from "vue";

let firstName = ref("章");

let lastName = ref("礼");

let fullName = computed(

() => firstName.value.slice(0, 1).toUpperCase() + firstName.value.slice(1) + lastName.value,

);

</script>

首先我们需要导入computed 然后使用这个计算属性定义fullName 通过这个方法,使得模板变得简易,可读性变高

计算属性默认只可读

事实上如果我在里面定义一个函数

function changeName() {

fullName.value = "李四";

}

这个changeName函数会报错 无法为“value”赋值,因为它是只读属性。 这是计算属性的只读特性

如何修改?

如果想要修改计算属性的值,我们需要getset方法

例如 来自于vue官方文档

<script setup>

import { ref, computed } from "vue";

const firstName = ref("John");

const lastName = ref("Doe");

const fullName = computed({

// getter

get() {

return firstName.value + " " + lastName.value;

},

// setter

set(newValue) {

// 注意:我们这里使用的是解构赋值语法

[firstName.value, lastName.value] = newValue.split(" ");

},

});

</script>

你发现了吗,这种修改本质上还是修改了firstNamelastName,那我们不禁想到,为什么我们不直接修改这两个的值,来实现通过计算属性更新fullName的值呢?

官方推荐

正如官方文档所言 避免直接修改计算属性值​ 从计算属性返回的值是派生状态。可以把它看作是一个“临时快照”,每当源状态发生变化时,就会创建一个新的快照。更改快照是没有意义的,因此计算属性的返回值应该被视为只读的,并且永远不应该被更改——应该更新它所依赖的源状态以触发新的计算。

所以,这种只读属性是必然的,我们完全可以通过修改那两个值实现计算属性的值的更新!