首页 > 其他分享 >vue3从精通到入门9:计算属性computed

vue3从精通到入门9:计算属性computed

时间:2024-04-02 10:58:06浏览次数:24  
标签:computed 缓存 const 入门 响应 计算 vue3 属性

在 Vue 3 中,computed 是一个用于创建计算属性的工具,它基于组件的响应式依赖进行复杂的计算,并返回一个新的响应式引用。计算属性是 Vue 的一个核心概念,它提供了一种声明式的方式来执行基于其依赖的响应式数据的计算。

computed使用:

计算属性与常规属性类似,但是它们是基于它们的依赖进行缓存的。只有当计算属性依赖的响应式数据发生变化时,它们才会重新求值。这意味着只要依赖没有变化,多次访问计算属性会立即返回之前缓存的结果,而不会重新执行计算逻辑。

 使用方法:

<template>  
  <div>  
    <p>原始值: {{ count }}</p>  
    <p>计算后的值: {{ doubleCount }}</p>  
    <button @click="increment">增加</button>  
  </div>  
</template>  
  
<script setup>  
import { ref, computed } from 'vue';  
  
// 创建响应式数据  
const count = ref(0);  
  
// 创建计算属性  
const doubleCount = computed(() => count.value * 2);  
  
// 定义方法  
function increment() {  
  count.value++;  
}  
</script>

count 是一个响应式数据,而 doubleCount 是一个计算属性,它返回 count 的两倍。当 count 的值发生变化时,doubleCount 会自动更新。

使用计算属性的好处是它们能够减少不必要的计算和渲染,提高性能。此外,它们还使得组件的逻辑更加清晰和易于维护。

 computed的使用场景

1. 复杂数据转换

当你需要从响应式数据中派生出一个经过计算或转换的新值时,可以使用 computed。例如,你可能有一个日期对象,而你想在模板中显示格式化的日期字符串。

<template>  
  <p>格式化后的日期: {{ formattedDate }}</p>  
</template>  
  
<script setup>  
import { ref, computed } from 'vue';  
  
const date = ref(new Date());  
  
const formattedDate = computed(() => {  
  return date.value.toLocaleDateString();  
});  
</script>

2. 依赖多个数据源的属性

如果你的计算属性依赖于多个响应式数据项,并且当这些数据项中的任何一个改变时,你都希望重新计算该属性,那么 computed 是非常有用的。

<template>  
  <p>总价: {{ totalPrice }}</p>  
</template>  
  
<script setup>  
import { ref, computed } from 'vue';  
  
const quantity = ref(2);  
const pricePerItem = ref(10);  
  
const totalPrice = computed(() => {  
  return quantity.value * pricePerItem.value;  
});  
</script>

3. 减少模板中的复杂逻辑

在模板中直接编写复杂的逻辑表达式可能会导致代码难以阅读和维护。使用 computed 可以将这些逻辑封装起来,使模板更加简洁清晰。

<template>  
  <p v-if="isUserActive">用户活跃</p>  
  <p v-else>用户不活跃</p>  
</template>  
  
<script setup>  
import { ref, computed } from 'vue';  
  
const lastActivity = ref(new Date(2023, 6, 1)); // 假设这是用户最后一次活动的日期  
  
const isUserActive = computed(() => {  
  const now = new Date();  
  const oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000); // 一小时前  
  return lastActivity.value > oneHourAgo;  
});  
</script>

4. 优化性能

计算属性会缓存其值,只有当其依赖的响应式数据发生变化时,才会重新计算。这种缓存机制可以帮助避免不必要的计算和渲染,从而提高应用程序的性能

与 watch 对比

虽然 watch 也可以用来观察和响应数据变化,但它主要用于执行异步操作或开销较大的操作。相比之下,computed 更适合用于同步计算,且由于它的缓存机制,通常比 watch 更高效。

 computed函数的原理

 computed函数的原理主要是基于Vue的响应式系统,通过getter和setter函数来创建和管理计算属性。

1. 响应式依赖收集:当在组件中定义计算属性时,Vue会为该计算属性创建一个getter函数。这个getter函数的作用就是返回计算属性的值。在getter函数执行的过程中,它可能会访问其他响应式数据(如data中的属性或props等)。每当getter函数访问这些响应式数据时,Vue的响应式系统会记录下这些依赖关系,即计算属性依赖于哪些响应式数据。

2. 缓存机制:计算属性的一个关键特性是它具有缓存机制。这意味着,只要计算属性所依赖的响应式数据没有发生变化,那么多次访问计算属性时,都会直接返回之前计算并缓存的结果,而不会重新执行getter函数中的计算逻辑。这种缓存机制大大提高了性能,避免了不必要的重复计算。

3. 依赖更新与重新计算:当计算属性所依赖的响应式数据发生变化时,Vue的响应式系统会触发依赖更新。这个过程会标记计算属性为“脏”状态,表示其值可能不再是最新的。在下一个组件更新周期中,Vue会重新执行计算属性的getter函数,以获取最新的计算结果,并更新缓存。这样,组件中绑定计算属性的地方就能显示最新的数据。

4. Setter函数:虽然大多数情况下我们主要关注计算属性的getter函数,但computed属性实际上也支持setter函数。setter函数在计算属性的值被显式修改时调用。然而,在实际开发中,我们通常会避免直接修改计算属性的值,因为这样会破坏其响应式依赖和缓存机制。如果需要修改计算属性的值,通常应该修改它所依赖的原始响应式数据。

总结:computed函数的原理是通过getter和setter函数来实现计算属性的创建、缓存、依赖收集和更新。这使得计算属性能够自动响应其依赖的响应式数据的变化,并在需要时重新计算值,从而保持与数据的同步,并优化性能。

标签:computed,缓存,const,入门,响应,计算,vue3,属性
From: https://blog.csdn.net/qq_40358970/article/details/137261379

相关文章

  • MyBatis入门
    大家好,我是王有志。今天开始我会和大家一起来学习在Java应用程序中使用非常广泛的持久层框架MyBatis。作为MyBatis系列的第一篇文章,我会先对MyBatis以及诞生的意义做一个简单的介绍,最后我们在一起动手完成一个简单的例子。Tips:文章最后的部分,我会对MyBatis中文网上“不......
  • gulp入门基础(1),前端热修复面试
    gulp.task(name[,deps],fn)定义一个gulp任务,name是任务名称。[,deps]是任务依赖。fn是任务回调函数。(1)任务依赖的形式可以是:gulp.task(‘two’,[‘one’],function(){//‘one’完成后});gulp.task(‘one’,function(cb){//cb();//returnstream;//ret......
  • 《Python从入门到实践》项目 数据可视化
    生成数据安装Matplotlibpython-mpipinstallmatplotlib绘制简单的折线图importmatplotlib.pyplotaspltsquares=[1,4,9,16,25]fig,ax=plt.subplots()ax.plot(squares)plt.show()首先导入pyplot模块,并给他指定别名plt,以免反复输入pyplot,然后调用subpl......
  • C++从入门到精通——auto的使用
    auto前言一、auto类型别名思考二、auto简介三、auto的使用细则auto与指针和引用结合起来使用在同一行定义多个变量auto不能推导的场景auto不能作为函数的参数auto不能直接用来声明数组`lambda`表达式前言C++的auto关键字用于自动推导变量的类型,让编译器根据变量的......
  • vue3 设置el-dialog height超过滚动条
     方法一:<stylescoped>::v-deep.el-dialog.el-dialog-body{height:500px;overflow-y:auto;}</style> 如果要设置动态的高度话,则要在setup里面设置 <script>exportdefaultdefineComponent({setup:{constcssContent=ref({heigh......
  • SQL SERVER 从入门到精通 第5版 第二篇 第6章 SQL函数的使用 读书笔记
     第六章SQL函数的使用按函数种类可以分为聚合函数,数学函数,字符串函数,日期和时间函数,转换函数和元数据函数6种.>.聚合函数. 聚合函数对一组值执行计算,并返回单个值.除count外,聚合函数都会忽略空值.通常与SELECT语句的GROUPBY子句一起......
  • 网络安全入门教程(非常详细)从零基础入门到精通!
    网络安全是一个庞大而不断发展的领域,它包含多个专业领域,如网络防御、网络攻击、数据加密等。介绍网络安全的基本概念、技术和工具,逐步深入,帮助您成为一名合格的网络安全从业人员。一、网络安全基础知识1.计算机基础知识了解了计算机的硬件、软件、操作系统和网络结构等基础......
  • SpringBoot集成MyBatis-Plus快速入门Demo
    目录1.MyBatis-Plus概述2.MyBatis-Plus框架结构3. MyBatis-Plus快速入门3.1 创建表3.2 创建工程3.3 导入依赖3.4添加配置文件application.yml,配置数据库信息3.5 创建实体类(包括自动填充)3.6创建配置类(包括配置乐观锁、分页、逻辑删除等插件) 3.7编写自动填......
  • vue3中播放flv流视频,以及组件封装超全
    实现以上功能的播放,只需要传入一个流的地址即可,当然组件也只有简单的实时播放功能下面直接上组件里面的flvjs通过npmiflv.js直接下载 <template><divclass="player"style="position:relative;"><pstyle="position:absolute!important;top:10px;lef......
  • 大屏可视化项目示例--基于Vue3+vite2+echart+mock+axios+dataV
    图例: 项目环境:Vite、Echarts、Npm、Node、axios、mock、vue3、dataV。项目地址:IofTV-Screen-Vue3:......