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,一经查实,立即删除!

相关文章

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.…

Nginx upstream

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

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

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

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…

python之多任务爬虫——线程、进程、协程的介绍与使用(16)

文章目录 1、什么是多任务?1.1 进程和线程的概念1.2 多线程与多进程的区别1.3 并发和并行2、python中的全局解释器锁3、多线程执行机制4、python中实现多线程(threading模块)4.1 模块介绍4.2 模块的使用5、python实现多进行程(Multiprocessing模块)5.1 导入模块5.2 模块的…

Caffeine本地缓存框架

Caffeine本地缓存框架 hi&#xff0c;我是阿昌&#xff0c;今天记录一下Java最强本地缓存Caffeine 1、缓存介绍 缓存(Cache)&#xff0c;在软件无处不在。从底层CPU多级缓存&#xff0c;再到客户页面缓存&#xff0c;和服务器数据缓存&#xff0c;导出都存在着缓存的身影&am…

HBuilder X 中Vue.js基础使用2(三)

一、条件渲染 1、条件判断 v-if &#xff1a; 表达式返回真值时才被渲染 v-else &#xff1a;表达式返回为假时不被渲染 2、 分支条件判断 v-else-if &#xff1a;使用v-if , v-else-if 和 v-else 来表示其他的条件分支 3、显示隐藏 v-show v-show true 把节点显示 …

PortQry下载安装使用教程(超详细),Windows测试UDP端口

《网络安全自学教程》 PortQry是微软官方提供的一款TCP/IP连接「排障工具」&#xff0c;用来「检查」TCP/UDP「端口状态」。 平时检查端口状态&#xff0c;最常用的是telnet&#xff0c;但它是基于TCP协议的&#xff0c;无法检测「UDP端口」&#xff0c;这篇文章教大家如何在W…

Axure随机验证码高级交互

亲爱的小伙伴&#xff0c;在您浏览之前&#xff0c;烦请关注一下&#xff0c;在此深表感谢&#xff01; 课程主题&#xff1a;字母数字随机验证码高级交互 主要内容&#xff1a;4位字母数字随机验证码生成、错误提示与State状态同步 应用场景&#xff1a;登录验证码、其他类…

面试宝典(五):用三个线程按顺序循环打印123三个数字,比如123123123

要使用三个线程按顺序循环打印123三个数字&#xff0c;势必要控制线程的执行顺序&#xff0c;可以使用java.util.concurrent包中的Semaphore类来控制线程的执行顺序。 代码示例 import java.util.concurrent.Semaphore;public class SequentialPrinting123 {private static Se…

leetcode:34. 在排序数组中查找元素的第一个和最后一个位置(python3解法)

#1024程序员节 | 征文# 难度&#xff1a;中等 给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(lo…

初识算法 · 前缀和(1)

目录 前言&#xff1a; 一维数组的前缀和 题目解析 算法原理 算法编写 二维数组的前缀和 题目解析 算法原理 算法编写 前言&#xff1a; ​本文的主题是前缀和&#xff0c;通过两道题目讲解&#xff0c;一道是一维数组的模板&#xff0c;一道是二维数组的模板。 链接…

【WebGIS实例】(18)MapboxGL 绘制矢量——线、面

前言 Mapbox GL JS 版本&#xff1a;3.6.0 该博客仅供学习参考&#xff0c;如果您是计划在实际项目中实现该功能&#xff0c;也推荐您直接使用已有的功能库&#xff1a; 官方案例&#xff1a;Draw a polygon and calculate its areamapbox-gl-draw&#xff1a;mapbox/mapbox-g…

基于Django+python的酒店客房入侵检测系统设计与实现

项目运行 需要先安装Python的相关依赖&#xff1a;pymysql&#xff0c;Django3.2.8&#xff0c;pillow 使用pip install 安装 第一步&#xff1a;创建数据库 第二步&#xff1a;执行SQL语句&#xff0c;.sql文件&#xff0c;运行该文件中的SQL语句 第三步&#xff1a;修改源…

HTTPS讲解

前瞻 HTTP与HTTPS的关系 HTTPS也是一个在应用层的协议&#xff0c;是在HTTP协议基础上的一个加密解密层 明文 密文 秘钥 明文->秘钥 加密 秘钥->明文 解密 例如:明文为7 秘钥为2 7^21015&#xff1b; 5就是密文例子: 因为http的内容是明文传输的&#xff0c;明文…