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.mzph.cn/bicheng/58169.shtml

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

相关文章

【牛客算法】某司面试算法题:找出最长山脉的长度

文章目录 一、题目1.1 题目描述1.2 示例11.2 示例21.3 提供的代码 二、如何完成这个算法题&#xff1f;2.1 解题思路解释复杂度 一、题目 1.1 题目描述 给定一个长度为 n 的正整数数组&#xff0c;每个元素表示一座山的高度。 其中满足以下条件的连续子数组称为山脉&#xf…

LLM | 论文精读 | NeurIPS 2023 | SWIFTSAGE: 结合快思考与慢思考的生成智能体

论文标题&#xff1a;SWIFTSAGE: A Generative Agent with Fast and Slow Thinking for Complex Interactive Tasks 作者&#xff1a;Bill Yuchen Lin, Yicheng Fu, Karina Yang, Faeze Brahman, Shiyu Huang, Chandra Bhagavatula, Prithviraj Ammanabrolu, Yejin Choi, Xian…

【Vue3】第二篇

Vue3学习第二篇 01. 事件处理02. 事件传参03. 事件修饰符04. 数组变化侦测05. 计算属性06. class绑定07. style绑定08. 侦听器09. 表单输入绑定10. 模板引用 01. 事件处理 在vue当中的事件处理和html、css中的不一样&#xff0c;它单独做了处理。 注意&#xff1a;用法中只是用…

【Android】浅析OkHttp(1)

【Android】浅析OkHttp&#xff08;1&#xff09; OkHttp 是一个高效、轻量级的 HTTP 客户端库&#xff0c;主要用于 Android 和 Java 应用开发。它不仅支持同步和异步的 HTTP 请求&#xff0c;还支持许多高级功能&#xff0c;如连接池、透明的 GZIP 压缩、响应缓存、WebSocke…

JUC并发编程面试题总结

文章目录 1、创建线程的三种方式2、线程的状态3、线程的上下文切换4、run和start的区别5、sleep和wait区别6、虚假唤醒&#xff0c;精确唤醒7、两阶段终止模式8、多线程下的线程安全问题9、如何解决线程安全问题10、synchornized的原理11、锁升级的机制12、锁消除13、批量重偏向…

Unity编辑器制作多级下拉菜单

Unity编辑器下拉菜单 大家好&#xff0c;我是阿赵。   在Unity引擎里面编写工具插件&#xff0c;有时候会用到一些特殊的菜单形式&#xff0c;比如下拉选项。 通过下拉菜单&#xff0c;给用户选择不同的选项。   如果只是一层的下拉列表&#xff0c;可以用EditorGUILayout.…

C++二级题 计算好数:1数大于0数(二进制的位运算)

1、题目 若将一个正整数化为二进制数&#xff0c;在此二进制数中&#xff0c;我们将数字1的个数多于数字0的个数的这类二进制数称为好数。 例如&#xff1a; (13)10 (1101)2&#xff0c;其中1的个数为3&#xff0c;0的个数为1&#xff0c;则此数是好数&#xff1b; (10)10 (1…

Nginx upstream

什么是Nginx upstream&#xff1f; Nginx 模块一般分为三大类&#xff1a;handler、filter和upstream。 利用 handler、filter 这两个模块&#xff0c;可以使 Nginx 轻松完成任何单机工作。 upstream 模块将使 Nginx 跨越单机的限制&#xff0c;完成网络数据的接收、处理和转…

【数学二】常微分方程-一阶微分方程

考试要求 1、了解微分方程及其阶、解、通解、初始条件和特解等概念. 2、掌握变量可分离的微分方程及一-阶线性微分方程的解法,会解齐次微分方程. 3、会用降阶法解下列形式的微分方程: y ( n ) f ( x ) , y ′ ′ f ( x , y ′ ) y^{(n)}f(x),y^{}f(x,y^{}) y(n)f(x),y′′f(…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-23目录1. Advancements in Visual Language Models for Remote Sensing: Datasets, Capabilities, and Enhancement Techniques摘…

git restore恢复删除文件

新版本 在 Git 2.23 版本之后&#xff0c;Git 引入了一个新的命令 git restore&#xff0c;用于简化文件恢复操作。可以用 git restore 来恢复误删除的文件。下面是详细的使用方法&#xff1a; 1. 恢复工作区中删除的文件&#xff08;未提交&#xff09; 如果文件已被删除&a…

对角双差速轮AGV平移、直行、转弯、原地旋转案例

在对角两对双差速轮 AGV(自动导引车)中,车辆配置了两对差速轮,分别安装在左前(Front Left,FL)和右后(Rear Right,RR)。这种配置使得 AGV 具有较高的机动性,可以实现平移、直行、转弯和原地旋转等复杂运动 2. 运动学模型 2.1 定义变量 车辆参数: r:车轮半径(米…

flask服务通过gunicorn启动

使用 Gunicorn 启动 Flask 服务通常可以提升 Flask 应用的性能。以下是通过 Gunicorn 启动 Flask 服务的步骤&#xff1a; 1. 安装依赖 首先&#xff0c;确保已安装 Flask 和 Gunicorn&#xff1a; pip install flask gunicorn2. 创建 Flask 应用 创建一个简单的 Flask 应用…

IPV6扩展头部

IPv6扩展头部&#xff08;Extension Header&#xff09;是一种用于在IPv6数据包中添加额外信息和功能的结构。与IPv4相比&#xff0c;IPv6的头部设计简化了基本头部&#xff0c;使其更灵活。扩展头部用于提供各种功能&#xff0c;如路由、分片、流量控制等。扩展头部的使用使得…

安全知识见闻-网络安全热门证书

一、OSCP(Offensive Security Certified Professional) 1. 证书介绍 2.考点 3.部分考试要求 4.练习方法 二、OSEP(Offensive Security Exploit Developer) 1.证书介绍 2.考点 3.练习方法 三、CISSP&#xff08;Certified lnformation Systems Security Professional&a…

技术成神之路:二十三种设计模式(导航页)

设计原则/模式链接面向对象的六大设计原则技术成神之路&#xff1a;面向对象的六大设计原则创建型模式单例模式建造者模式原型模式工厂方法模式抽象工厂模式行为型模式策略模式状态模式责任链模式观察者模式备忘录模式迭代器模式模板方法模式访问者模式中介者模式命令模式解释器…

【已解决,含泪总结】非root权限在服务器上配置python和torch环境,代码最终成功训练(一)

配置Python环境 没有root权限服务器上有多个python环境但没有自己想要的怎么办 之前跑别的实验的时候改过指定的python3.7版本&#xff0c;但是居然我过了一段时间之后&#xff0c;再次打开&#xff0c;python版本居然又回到2.7&#xff08;服务器/usr/下的默认python版本&am…

什么是AI神经网络?

文章目录 神经网络的基本概念如何工作&#xff1f;训练过程应用实例未来展望推荐阅读文章 在当今的科技时代&#xff0c;人工智能&#xff08;AI&#xff09;已经深入到我们生活的各个方面&#xff0c;而神经网络则是推动这一发展的重要技术之一。无论是在图像识别、自然语言处…

Zig 语言通用代码生成器:逻辑,冒烟测试版发布二

Zig 语言通用代码生成器&#xff1a;逻辑&#xff0c;冒烟测试版发布二 Zig 语言是一种新的系统编程语言&#xff0c;其生态位类同与 C&#xff0c;是前一段时间大热的 rust 语言的竞品。它某种意义上的确非常像 rust&#xff0c;尤其是在开发过程中无穷无尽抛错的过程&#x…

高等数学-宋浩版2.0-映射

映射&#xff1a;X,Y为非空集合&#xff0c;存在法则F,对X(原像)中每个元素X&#xff0c;按法则F&#xff0c;在Y中有唯一元素与之对应&#xff0c;F为x到Y&#xff08;镜像&#xff09;的映射。f:X->Y X原像&#xff0c;Y像&#xff0c;x定义域&#xff0c;Df,Rf &#x…