Vue3 学习笔记(七)Vue3 语法-计算属性 computed详解

#1024程序员节|征文#

在这里插入图片描述


1、计算属性 computed


在 Vue.js 中,计算属性(computed properties)是一种特殊的响应式属性,它们根据依赖的响应式数据自动更新。计算属性非常适合用于当你需要根据现有数据派生出一些状态时。


(1)、基本用法

计算属性是通过在组件的 computed 选项中定义的。它们使用一个函数来计算值,这个函数的返回值就是计算属性的值。这个函数会接收组件实例作为上下文(即 this),并可以访问组件的响应式数据。

import { computed, ref } from 'vue';export default {setup() {const count = ref(0);// 定义一个计算属性const doubledCount = computed(() => count.value * 2);return {count,doubledCount};}
};

在上面的示例中,doubledCount 是一个计算属性,它依赖于 count。每当 count 的值变化时,doubledCount 会自动更新。


(2)、缓存性

计算属性具有缓存性,这意味着只有当依赖的响应式数据变化时,计算属性才会重新计算。这可以提高性能,特别是当计算属性的计算成本较高时。

import { computed, ref } from 'vue';export default {setup() {const count = ref(0);// 定义一个计算属性const expensiveComputed = computed(() => {console.log('Computing expensive value...');return count.value * 2;});return {count,expensiveComputed};}
};

在这个例子中,每次 count 更新时,控制台都会打印 “Computing expensive value…”,但由于计算属性的缓存性,这个日志只会在 count 实际变化时出现。


(3)、不是所有场景都适合计算属性

虽然计算属性很强大,但它们并不适用于所有场景。如果某个值的计算不依赖于响应式数据,或者需要在每次访问时都进行计算(例如,随机数生成),则不应该使用计算属性。


(4)、计算属性 vs 方法

计算属性与方法(methods)不同。方法在每次调用时都会执行函数,而计算属性则具有缓存性,只有当依赖的数据变化时才会重新计算。因此,如果你需要在每次访问时都执行计算,应该使用方法而不是计算属性。

import { ref } from 'vue';export default {setup() {const now = ref(Date.now());// 使用方法而不是计算属性const timeString = () => now.value.toLocaleTimeString();return {now,timeString};}
};

2、计算属性应用场景


计算属性(computed properties)在 Vue.js 中适用于多种场景,尤其是当你需要根据组件中现有的响应式数据来声明派生数据时。以下是一些计算属性的应用场景示例:


(1)、根据多个数据属性计算新的数据

假设你有一个组件,它维护了用户的购物车信息,包括商品的原价和折扣后的价格。你可能需要计算商品的最终价格。

<template><div><p>原价: {{ product.originalPrice }}</p><p>折扣价: {{ product.discountedPrice }}</p><p>最终价格: {{ finalPrice }}</p></div>
</template><script>
import { computed, reactive } from 'vue';export default {setup() {const product = reactive({originalPrice: 100,discountedPrice: 80});const finalPrice = computed(() => product.originalPrice * product.discountedPrice / 100);return {product,finalPrice};}
};
</script>

(2)、根据用户输入动态计算结果

在表单中,你可能需要根据用户输入的数据动态计算一些结果,如总价、折扣、税费等。

<template><div><input v-model="quantity" type="number" placeholder="数量"><input v-model="pricePerItem" type="number" placeholder="单价"><p>总价: {{ totalPrice }}</p></div>
</template><script>
import { computed, ref } from 'vue';export default {setup() {const quantity = ref(1);const pricePerItem = ref(0);const totalPrice = computed(() => quantity.value * pricePerItem.value);return {quantity,pricePerItem,totalPrice};}
};
</script>

(3)、根据数组内容计算新的数组

如果你有一个商品列表,你可能需要根据这个列表计算出一些新的列表,比如筛选后的列表或排序后的列表。

<template><div><ul><li v-for="item in filteredProducts" :key="item.id">{{ item.name }} - {{ item.price }}</li></ul></div>
</template><script>
import { computed, ref } from 'vue';export default {setup() {const products = ref([{ id: 1, name: 'Product A', price: 100 },{ id: 2, name: 'Product B', price: 200 },// more products]);const filteredProducts = computed(() =>products.value.filter(product => product.price > 100));return {filteredProducts};}
};
</script>

(4)、根据对象数据计算新的值

如果你有一个对象,包含用户的基本信息,你可能需要根据这些信息计算出一些新的值,比如年龄、全名等。

<template><div><p>用户信息:</p><p>名字: {{ user.name }}</p><p>姓氏: {{ user.surname }}</p><p>全名: {{ fullName }}</p></div>
</template><script>
import { computed, reactive } from 'vue';export default {setup() {const user = reactive({name: 'John',surname: 'Doe',birthday: '1990-01-01'});const fullName = computed(() => `${user.name} ${user.surname}`);return {user,fullName};}
};
</script>

(5)、性能优化

计算属性可以用于性能优化,避免在模板或方法中重复执行相同的计算逻辑。

<template><div><p>列表长度: {{ listLength }}</p></div>
</template><script>
import { computed, ref } from 'vue';export default {setup() {const items = ref([/* ... */]);const listLength = computed(() => items.value.length);return {listLength};}
};
</script>

在这些示例中,计算属性允许你将复杂的逻辑放在 JavaScript 中处理,同时保持模板的简洁和声明性。这使得你的组件更容易维护和理解。


3、计算属性最佳实践


以下是一些使用计算属性的最佳实践:

(1)、 保持简洁

计算属性应该只包含必要的逻辑,用于根据响应式数据派生新的值。避免在计算属性中执行副作用操作,如 API 调用或更改其他响应式状态。


(2)、 避免复杂逻辑

如果计算属性的逻辑变得过于复杂,考虑将其拆分为多个更小的计算属性或方法。


(3)、 使用缓存

利用计算属性的缓存特性,避免不必要的计算。只有当依赖的数据变化时,计算属性才会重新计算。这意味着在模板或其他地方多次使用计算属性时,它只会计算一次。


(4)、 避免直接修改计算属性

计算属性是只读的,不应该直接修改。如果你需要修改计算属性的值,应该修改它的依赖数据。


(5)、选择合适的名称

给计算属性取一个清晰和描述性的名称,这样其他开发者可以很容易地理解这个计算属性的用途。


(6)、避免在计算属性中进行异步操作

计算属性应该基于同步操作,因为它们是响应式系统的同步部分。异步操作应该在方法或生命周期钩子中处理。


(7)、使用计算属性而不是观察者

如果你发现自己需要在多个地方执行相同的计算逻辑,考虑使用计算属性而不是使用 watch 或 `watchEffec


(8)、避免在模板中使用复杂表达式

对于模板中需要的复杂表达式,应该使用计算属性而不是在模板中直接编写复杂表达式。


(9)、组合使用计算属性和侦听器

在某些情况下,你可能需要在计算属性变化时执行额外的逻辑。这时,可以结合使用计算属性和 watch 侦听器。


(10)、考虑使用 watchEffect

如果你需要在多个响应式数据变化时执行副作用,考虑使用 watchEffect 而不是计算属性。


示例:计算属性和 watch 组合使用

<template><div>{{ fullName }}</div>
</template><script>
import { computed, watch, ref } from 'vue';export default {setup() {const firstName = ref('');const lastName = ref('');const fullName = computed(() => `${firstName.value} ${lastName.value}`);watch(fullName, (newName, oldName) => {console.log(`Name changed from ${oldName} to ${newName}`);// 执行一些副作用,比如 API 调用});return {fullName,firstName,lastName};}
};
</script>

在上述示例中,fullName 是一个计算属性,它依赖于 firstNamelastName。我们使用 watch 来侦听 fullName 的变化,并在变化时执行副作用。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/457942.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IntelliJ IDEA 查看类class的结构Structure轮廓outline窗口, 快捷键是Alt+7

IntelliJ IDEA 查看类class的结构Structure轮廓outline窗口, 快捷键是Alt7 idea的结构Structure窗口相当于Eclipse的outline 快捷键是: Alt7 或者点击左上角主菜单面包屑,打开主菜单 然后菜单找到-视图&#xff08;View&#xff09;→ 工具窗口&#xff08;Tool Windows&…

基于大数据 Python+Vue 酒店爬取可视化系统(源码+LW+部署讲解+数据库+ppt)

&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 会持续一直更新下去 有问必答 一键收藏关注不迷路 源码获取&#xff1a;https://pan.baidu.com/s/1aRpOv3f2sdtVYOogQjb8jg?pwdjf1d 提取码: jf1d &#…

FineReport 分栏报表

将报表中的数据根据所需要的展示的样式将数据进行分栏展示列分栏 报表中数据是横向扩展的,超过一页的数据会显示在下一页,而每页下面会有很大的一片空白区域,不美观且浪费纸张。希望在一页中第一行扩展满后自动到下一行继续扩展 1、新建数据集 SELECT * FROM 公司股票2、内…

前端代码分享--爱心

给对象写的&#xff0c;顺便源码给大家分享一下 就是简单的htmlcssjs&#xff0c;不复杂 xin1.html <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>写你自己的</title> <lin…

深入解析机器学习算法

深入解析机器学习算法 机器学习已经成为当今技术进步的核心推动力量&#xff0c;推动了众多行业的创新。其背后依赖的是各种各样的算法&#xff0c;帮助计算机通过从数据中学习来完成任务。这篇文章将对常见的几类机器学习算法进行深入探讨&#xff0c;帮助你理解其工作原理、…

攻防世界的新手web题解

攻防世界引导模式 1、disabled_button 好&#xff0c;给了一个按钮&#xff0c;第一道题目就不会做 看的wp<input disabled class"btn btn-default" style"height:50px;width:200px;" type"submit" value"flag" name"auth&q…

qt 滚动条 美化

qt QScrollBar 滚动条分为竖直与水平滚动条&#xff0c;两者设置上类似&#xff0c;但也有一些不同&#xff0c;下面主要讲述美化及注意事项。 一、竖直滚动条 竖直滚动条分为7个部分&#xff1a; sub-line、 up-arrow 、sub-page、 hanle、 add-line、 dow-arrow、 add-pag…

猴子请来的补丁——Python中的Monkey Patching

猴子补丁&#xff08;Monkey Patching&#xff09;在Python中是一种允许在运行时修改对象行为的技术。这种技术可以在不直接修改原始源代码的情况下&#xff0c;动态地改变或扩展程序的行为。 猴子补丁的原理 猴子补丁的核心原理是利用Python的动态特性&#xff0c;即在运行时…

研究生论文学习记录

文献检索 检索论文的网站 知网&#xff1a;找论文&#xff0c;寻找创新点paperswithcode &#xff1a;这个网站可以直接找到源代码 直接再谷歌学术搜索 格式&#xff1a;”期刊名称“ 关键词 在谷歌学术搜索特定期刊的关键词相关论文&#xff0c;可以使用以下几种方法&#…

Java并发学习总结:原子操作类

本文是学习尚硅谷周阳老师《JUC并发编程》的总结&#xff08;文末有链接&#xff09;。 基本类型原子类 AtomicIntegerAtomicLongAtomicBoolean AtomicInteger 的方法 getAndIncrement 和 incrementAndGet 的区别&#xff1a; 两个方法都能实现对当前值加 1 &#xff0c; 但…

web服务实验

http实验 先创建需要访问的web页面文件index.html 编辑vim /etc/nginx/conf.d/testip.conf 测试通过域名访问需要编辑/etc/hosts 如果通过windows的浏览器访问需要编辑下面的文件通过一管理员身份打开的记事本编辑 C:\Windows\System32\drivers\etc下的hosts文件 192.168.1…

软考:GPU算力,AI芯片

算力 FLOPS&#xff08;每秒浮点操作&#xff09; NVIDIA 去年就有超过 1 exa 的新闻&#xff0c;所以这个数值是越大越好。 AI芯片的技术架构类型 GPU&#xff1a;图形处理单元&#xff0c;擅长并行处理&#xff0c;适用于深度学习等AI计算密集型任务。FPGA&#xff1a;现…

OpenStack将运行的系统导出 QCOW2 镜像并导入阿里云

项目背景 OpenStack&#xff0c;作为一个开源的云计算平台&#xff0c;经常被用于构建私有云和公有云服务。然而&#xff0c;随着业务的发展和扩展&#xff0c;企业可能会面临将在OpenStack上运行的虚拟机迁移到其他云服务供应商的需求 需求 因为运营团队在本地机房有一台 O…

Netty-TCP服务端粘包、拆包问题(两种格式)

前言 最近公司搞了个小业务&#xff0c;需要使用TCP协议&#xff0c;我这边负责服务端。客户端是某个设备&#xff0c;客户端传参格式、包头包尾等都是固定的&#xff0c;不可改变&#xff0c;而且还有个蓝牙传感器&#xff0c;透传数据到这个设备&#xff0c;然后通过这个设备…

pandas快速入门

pandas快速入门 1. 创建pandas对象1.1 前言1.2 使用DataFrame类创建pandas对象1.3 对DataFrame对象进行索引1.4 使用Series类创建pandas对象1.5 对DataFrame Series对象使用常见方法 2. pandas读取文件2.1 使用pd.read_*方法读取文件2.2 使用to_*保存数据2.3 使用info()方法查看…

Python 判断键是否存在字典中(新手入门、实战案例)

在早期的Python2版本中&#xff0c;可以使用 dict.has_key()方法来判断一个键是否存在于字典中。 在Python3中&#xff0c;dict.has_key()方法被废弃了&#xff0c;不能再被使用。如果在Python3中尝试使用dict.has_key()方法会导致 AttributeError异常。 那在Python3中要如何判…

Linux:指令再认识

文章目录 前言一、知识点1. Linux下一切皆文件&#xff0c;也就是说显示器也是一种文件2. 指令是什么&#xff1f;3. ll 与 ls -l4. 日志5. 管道6. 时间戳 二、基本指令1. man指令2. cp指令3. mv指令4. 查看文件1&#xff09;cat/tac指令——看小文件2&#xff09;more/less指令…

Qt:QtCreator使用

用一个QtCreator适配所有Qt版本 首先Qt和QtCreator版本并不是通用的&#xff0c;一个电脑中可以安装很多个Qt版本&#xff0c;但只需要安装一个最新版本的QtCreator即可 Qt是一个语言&#xff0c;也可理解为一个SDK库&#xff0c;Qt目前最新版本为6.7 QtCreator是一个集成开发…

嵌入式Linux的AXI平台(platform)驱动教程

本文以JFMQL100的Linux系统的AXI接口的平台驱动为例&#xff0c;介绍嵌入式Linux的平台驱动编写、测试软件编写以及验证方式。本文的方法适用于任意嵌入式芯片Linux的物理地址映射的平台&#xff08;platform&#xff09;驱动的编写、测试与应用。 本文中AXI的开始地址为0x8000…

Python浪漫之画星星

效果图&#xff08;动态的哦&#xff01;&#xff09;&#xff1a; 完整代码&#xff08;上教程&#xff09;&#xff1a; import turtle import random import time # 导入time模块# 创建一个画布 screen turtle.Screen() screen.bgcolor("red")# 创建一个海龟&a…