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

计算属性的定义

在 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.hqwc.cn/news/65611.html

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

相关文章

7-4 求整数均值

本题要求编写程序&#xff0c;计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。 输入格式: 输入在一行中给出4个整数&#xff0c;其间以空格分隔。 输出格式: 在一行中按照格式“Sum 和; Average 平均值”顺序输出和与平均值&#xff0c;其中平均值精确到小…

【MySQL】Java实现JDBC编程

文章目录 1. JDBC2. 添加驱动包3. 编程3.1 创建数据源3.2 与数据库建立连接3.3 构造SQL语句3.4 执行SQL语句3.5 释放资源&#xff0c;关闭连接 1. JDBC 数据库编程必须掌握至少一门编程语言&#xff0c;一种数据库&#xff0c;会导入数据库驱动包。 操作和连接不同数据库都需要…

09-1_Qt 5.9 C++开发指南_Qchart概述

Qt Charts 可以很方便地绘制常见的折线图、柱状图、饼图等图表&#xff0c;不用自己耗费时间和精力开发绘图组件或使用第三方组件了。 本章首先介绍 Qt Charts 的基本特点和功能&#xff0c;以画折线图为例详细说明 Qt Charts 各主要部件的操作方法&#xff0c;再介绍各种常用…

进程间的通信

进程的通信&#xff0c;光是听概念就知道这是一个非常重要的知识点&#xff0c;但是之前学习的概念其实都无法实现真正意义上的进程间的通信&#xff1a; 子进程调用exit或Exit或_exit&#xff0c;然后父进程通过wait可以知道其状态&#xff0c;这虽然实现了消息的传递&#x…

react中使用路由起手式,一些思路和细节。

一.安装并配置 我们选择使用react-router实现路由效果 yarn add react-router-dom下载后需要对Route进行引入&#xff0c;是个内置的组件。该组件是有两个属性一个是path&#xff0c;一个是component&#xff0c;path是组件对应的路由&#xff0c;component是对应的组件 二.…

Vue+SpringBoot项目开发:登录页面美化,登录功能实现(三)

写在开始:一个搬砖程序员的随缘记录上一章写了从零开始VueSpringBoot后台管理系统&#xff1a;Vue3TypeScript项目搭建 VueTypeScript的前端项目已经搭建完成了 这一章的内容是引入element-plus和axios实现页面的布局和前后端数据的串联&#xff0c;实现一个登陆的功能&#x…

LeetCode150道面试经典题--赎金信(简单)

1.题目 给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 2.示例 3.思路 统计字…

1572. 矩阵对角线元素的和

题目描述&#xff1a; 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例&#xff1a; 解题思路&#xff1a; 同时求对角线和副对角线上元素的和再减去重合的元素 相关代码&#xf…

Web 服务器 -【Tomcat】的简单学习

Tomcat1 简介1.1 什么是Web服务器 2 基本使用2.1 下载2.2 安装2.3 卸载2.4 启动2.5 关闭2.6 配置2.7 部署 3 Maven创建Web项目3.1 Web项目结构3.2 创建Maven Web项目 4 IDEA使用Tomcat4.1 集成本地Tomcat4.2 Tomcat Maven插件 Tomcat 1 简介 1.1 什么是Web服务器 Web服务器是…

设计模式之七:适配器模式与外观模式

面向对象适配器将一个接口转换成另一个接口&#xff0c;以符合客户的期望。 // 用火鸡来冒充一下鸭子class Duck { public:virtual void quack() 0;virtual void fly() 0; };class Turkey { public:virtual void gobble() 0;virtual void fly() 0; };class TurkeyAdapter :…

金融反欺诈的应用实践

“根据980起全球重大金融欺诈事件分析&#xff0c;60%的欺诈发生在移动端&#xff0c;同比增长170%。“&#xff0c;在香港近日举办的金融科技沙龙上&#xff0c;顶象金融业务安全专家史博表示&#xff0c;金融业已成为不法分子重要的攻击对象。 本届金融科技沙龙由Databricks…

【C++11】异常

文章目录 一.C语言传统的处理错误的方式二.C异常概念三.异常的用法1.异常的抛出和捕获2.异常的重新抛出3.异常安全4.异常规范 四.自定义异常体系五.标准库异常体系六.异常的优缺点 一.C语言传统的处理错误的方式 传统的错误处理机制&#xff1a; 终止程序&#xff0c;如asser…