深入理解 Vue 3 计算属性:优雅地处理响应式数据计算

news2024/12/25 15:29:08

计算属性的定义

在 Vue3 的 HTML 模板中是支持 JavaScript 表达式的,例如:

<h2>买5个共计:{{ price * 5 }} 元</h2>

但是如果当表达式过于复杂时,模板代码就会变得非常臃肿并且可读性就会变差,恰巧,如果页面中有多个地方需要使用这个表达式,那么整体的 Vue 模板的代码将会变得非常难以维护,而且在 MVVP 模式下,模板中过多的处理数据计算,也会导致模板和控制器之间高度耦合。

Vue.js 中使用了计算属性来解决表达式逻辑过于复杂的场景,使页面尽可能没有数据复杂处理。

计算属性用于从现有数据派生衍生数据,它们基于Vue实例中已有的数据,通过对这些数据进行计算得出新的值,因此我们只需要声明衍生数据的计算逻辑即可,同时计算属性会自动跟踪依赖的数据,并在相关数据发生变化时自动更新计算结果,这样,当依赖数据发生改变时,计算属性会自动重新计算,不需要手动控制何时进行计算或更新,而 JavaScript 表达式则需要我们在特定的时机通过代码执行来计算值。具体代码如下:

<script lang="ts" setup>
import { computed, ref } from 'vue';

const price = ref<number>(6)

const totalPrice = computed(():number => {
    return price.value * 5
})

</script>

<template>
    <h2>单价:{{ price }} 元/件</h2>
    <h2>买5个共计:{{ totalPrice }} 元【计算属性】</h2>
    <h2>买5个共计:{{ price * 5 }} 元【JavaScript 表达式】</h2>
</template>

上述代码中,我们使用 ref 创建了一个表示商品单价的 price 数据引用,指定其类型为 number,初始值为 6

接下来,我们使用 computed 创建了一个计算属性 totalPrice。在计算属性的回调函数中,我们将 price.value 乘以 5,并返回计算结果。

在模板部分,我们分别使用了计算属性 totalPrice 和 JavaScript 表达式来显示计算结果。其中,由于计算属性会自动跟踪依赖的数据,如果 price 变量被修改,则对应的 totalPrice 的结果也会被立刻修改。

计算属性的使用

在 Vue 3 的 <script setup> 语法糖中,计算属性有两种用法:

  1. 第一种为上述样例中直接将实现函数以参数的形式传递给 computed() 方法实现,样例如下:

    <script lang="ts" setup>
    import { computed } from 'vue';
    
    // 定义计算属性
    const propertyName = computed(() => {
       // 计算并返回属性值
       return /* 衍生属性的计算逻辑 */;
    });
    </script>
    
    <template>
      <p>{{ propertyName }}</p>
    </template>
    

    可以在模板中直接使用双大括号 {{ }} 来显示计算属性的值。

  2. 第二种则是分别具体实现 getter 和 setter方法,然后再封装成对象传递给 computed(),样例如下:

    <script setup lang="ts">
    import { computed } from 'vue';
    
    // 定义计算属性
    const propertyName = computed({ 
        get: /* Getter 方法 */,
        set: /* Setter 方法 */
    });
    </script>
    <template>
        <p>{{ propertyName }}</p>
    </template>
    

    可以通过定义 getset 方法来创建带有读取和设置功能的计算属性。get 方法用于获取计算属性的值,而 set 方法用于更新计算属性的值。

在计算属性的两种实现方法中,第一种实现方法的底层逻辑仅仅实现了计算属性默认的 getter方法,如果我们需要在 setter 中进行其他数据操作,可以根据具体需求按照第二种写法来实现计算属性。

计算属性的缓存

在 Vue 3 的 <script setup> 语法糖中,计算属性默认是具有缓存的。它们会根据依赖的响应式数据进行缓存,首次渲染时,计算属性会进行初始计算,并将结果缓存起来。在后续渲染中,只有当依赖项发生变化时,计算属性才会重新计算,并更新模板中对应的值。

为了看到的效果更加明显,我们可以直接在表达式中调用 methods 方法修改数据进行对比。样例如下:

<script lang="ts" setup>
import { computed, ref } from 'vue';

const price = ref<number>(6)

// 定义计算属性
const computedPrice = computed(():number => {
    console.log("computedPrice 被调用");
    return price.value * 5
})

// 定义方法
const methodsPrice = ():number => {
    console.log("methodsPrice 被调用");
    return price.value * 5
}
</script>

<template>
    <h2>单价:{{ price }} 元/件</h2>
    <h2>买5个共计:{{ computedPrice }} 元</h2>
    <h2>买5个共计:{{ computedPrice }} 元</h2>
    <h2>买5个共计:{{ methodsPrice() }} 元</h2>
    <h2>买5个共计:{{ methodsPrice() }} 元</h2>
</template>

在模板中分别调用 computedPrice 计算属性两次、 methodsPrice() 方法两次。

我们可以在浏览器的控制台中查看打印的日志:

image-20230813142501100

可以看到右侧的控制台中,计算属性函数只被调用了一次,而方法函数则被调用了两次,原因就是计算属性默认具有缓存功能,在依赖项未发生变化时会直接使用缓存立刻返回结果,而不是再次执行计算返回结果,即在多次访问同一个计算属性时,只会进行一次计算,提高性能。

有了计算属性提供的缓存,可以极大的提高页面渲染效率。但是如果计算属性函数中的数据不是响应式依赖,就不会触发计算属性的缓存机制。

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

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

相关文章

【设计模式——学习笔记】23种设计模式——解释器模式Interpreter(原理讲解+应用场景介绍+案例介绍+Java代码实现)

案例引入 通过解释器模式来实现四则运算&#xff0c;如计算ab-c的值&#xff0c;具体要求 先输入表达式的形式&#xff0c;比如abc-de&#xff0c;要求表达式的字母不能重复在分别输入a,b,c,d,e的值最后求出结果 传统方案 编写一个方法&#xff0c;接收表达式的形式&#xf…

vue中有趣的几个功能

vue中有趣的几个功能 老实说&#xff0c;我们大多数人都不太喜欢阅读文档&#xff0c;但是当使用像 Vue 这样不断发展的现代前端框架时&#xff0c;每个新版本都会发生很多变化&#xff0c;我们可能会错过一些后来推出的新的、闪亮的功能。让我们来看看那些有趣但不那么受欢迎…

【Windows 常用工具系列 5 -- Selenium IDE的使用方法 】

文章目录 Selenium 介绍Selenium IDE 介绍 Selenium IDE安装Chrome 浏览器安装Selenium IDE使用 Selenium 介绍 Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 Selenium家庭成员有三个&#xff0c;分别是S…

并发冲突导致流量放大的线上问题解决

事故现象 生产环境&#xff0c;转账相关请求失败量暴增。 直接原因 现网多个重试请求同时到达 svr&#xff0c;导致内存数据库大量返回时间戳冲突。业务方收到时间戳冲突&#xff0c;自动进行业务重试&#xff0c;服务内部也存在重试&#xff0c;导致流量放大。 转账 首先…

【CI/CD】基于 Jenkins+Docker+Git 的简单 CI 流程实践(上)

基于 JenkinsDockerGit 的简单 CI 流程实践&#xff08;上&#xff09; 在如今的互联网时代&#xff0c;随着软件开发复杂度的不断提高&#xff0c;软件开发和发布管理也越来越重要。目前已经形成一套标准的流程&#xff0c;最重要的组成部分就是 持续集成 及 持续交付、部署。…

用对角线去遍历矩阵

原题链接 用对角线遍历矩阵https://leetcode.cn/leetbook/read/array-and-string/cuxq3/ 算法分析 图一 图二 图三 图四 由上述四个图可以总结得出以下八个结论&#xff1a; 结论1&#xff1a;k属于[0,a(max)b(max)]。 结论2&#xff1a;每一层遍历行最多存在min(m,n)个矩…

深度学习实战基础案例——卷积神经网络(CNN)基于SqueezeNet的眼疾识别|第1例

文章目录 前言一、数据准备1.1 数据集介绍1.2 数据集文件结构 二、项目实战2.1 数据标签划分2.2 数据预处理2.3 构建模型2.4 开始训练2.5 结果可视化 三、数据集个体预测 前言 SqueezeNet是一种轻量且高效的CNN模型&#xff0c;它参数比AlexNet少50倍&#xff0c;但模型性能&a…

4.深入对象

4.1创建对象三种方式 1.利用对象字面量创建对象 const obj{ name : 佩奇 }2.利用new 0bject创建对象 const obj new Object({ name: 佩奇 }) console.log(obj) // {name: 佩奇}3.利用构造函数创建对象 4.2构造函数 构造函数&#xff1a;是一种特殊的函数,主要用来初始化…

hive 中最常用日期处理函数

hive 常用日期处理函数 在工作中&#xff0c;日期函数是提取数据计算数据必须要用到的环节。哪怕是提取某个时间段下的明细数据也得用到日期函数。今天和大家分享一下常用的日期函数。为什么说常用呢&#xff1f;其实这些函数在数据运营同学手上是几乎每天都在使用的。 技术交…

Metasploit教程 - 基本命令

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、metasploit版本二、命令1.help2.msfupdate 命令3.search命令 三.Armitage GUI四&#xff0c;扫描总结 我想我得对我的博客做一些美化&#xff0c;而不是只有…

【Power BI】使用 Power BI 处理结构化复杂表单数据 | 文末送书

文章目录 前言使用 Power BI 处理结构化复杂表单数据案例一、处理标题与内容同行的数据表案例二、处理标题与内容同单元格的数据表 文末总结Power BI 新书推荐 前言 数据处理是数据分析的奠基石&#xff0c;只有使用处理干净的数据&#xff0c;分析才会产生价值。简单而言&…

Nacos AP架构集群搭建(Windows)

手写SpringCloud项目地址&#xff0c;求个star github:https://github.com/huangjianguo2000/spring-cloud-lightweight gitee:https://gitee.com/huangjianguo2000/spring-cloud-lightweigh 目录&#xff1a; 一&#xff1a;初始化MySQL 二&#xff1a;复制粘贴三份Nacos文…

【设计模式】拦截过滤器模式

拦截过滤器模式&#xff08;Intercepting Filter Pattern&#xff09;用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器&#xff0c;并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志&#xff0c;或者跟踪请求&#xff0c;然后把请…

Docker启动相关的命令

1.Docker服务相关命令 操作daemon CentOS7版本启动docker systemctl start docker systemctl status docker停掉docker服务&#xff1a; systemctl stop docker重启命令 systemctl restart docker开机自启docker systemctl enable docker2.小结

8.13黄金是否进入下行通道?下周开盘如何布局

近期有哪些消息面影响黄金走势&#xff1f;黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(8月11日)现货黄金小幅收低&#xff0c;受累于美元走强和美国国债收益率上升&#xff0c;本周录得6月底以来最差单周表现。投资者在评估最新一批通胀报告和消费者信…

欧拉公式之证明

首先&#xff0c;我们考虑复数函数的泰勒级数展开式。对于任意一个复数函数f(z)&#xff0c;我们可以将其在za处进行泰勒级数展开&#xff1a; f(z) f(a) f(a)(z-a) f(a)(z-a)^2/2! f(a)(z-a)^3/3! ... 其中f(a)表示f(z)在za处的导数&#xff0c;f(a)表示f(z)在…

Docker查看、创建、进入容器相关的命令

1.查看、创建、进入容器的指令 用-it指令创建出来的容器&#xff0c;创建完成之后会立马进入容器。退出之后立马关闭容器。 docker run -it --namec1 centos:7 /bin/bash退出容器&#xff1a; exit查看现在正在运行的容器命令&#xff1a; docker ps查看历史容器&#xff0…

【前端】求职必备知识点4-CSS:flex、隐藏元素(7种方法)、单位

文章目录 flex隐藏元素&#xff08;7种方法&#xff09;不占位置占位置 单位思维导图 flex 【前端】CSS3弹性布局&#xff08;flex&#xff09;、媒体查询实现响应式布局和自适应布局_css媒体查询 自适应_karshey的博客-CSDN博客 flex缩写&#xff1a; flex-grow 和 flex-shr…

聚类与回归

聚类 聚类属于非监督式学习&#xff08;无监督学习&#xff09;&#xff0c;往往不知道因变量。 通过观察学习&#xff0c;将数据分割成多个簇。 回归 回归属于监督式学习&#xff08;有监督学习&#xff09;&#xff0c;知道因变量。 通过有标签样本的学习分类器 聚类和…