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

news/2024/11/16 15:20:50/

计算属性的定义

在 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.ppmy.cn/news/1028056.html

相关文章

Linux 查看内存使用情况的几种方法

在运行 Linux 系统的过程中为了让电脑或者服务器以最佳水平运行&#xff0c;常常需要监控内存统计信息。 那么今天我们就来看看有哪些方法可以访问所有相关信息并帮助管理员监控内存统计信息。 查看或者获取 Linux 中的内存使用情况既可以通过命令的方式&#xff0c;也可以通…

前端性能优化——包体积压缩,打包速度提升,提升浏览器响应的速率

前端代码优化 –其他的优化可以具体在网上搜索 压缩项目打包后的体积大小、提升打包速度&#xff0c;是前端性能优化中非常重要的环节&#xff0c;结合工作中的实践总结&#xff0c;梳理出一些 常规且有效 的性能优化建议 ue 项目可以通过添加–report命令&#xff1a; "…

FL Studio for Windows-21.1.0.3713中文直装版功能介绍及系统配置要求

FL Studio 21简称FL水果软件,全称是&#xff1a;Fruity Loops Studio编曲&#xff0c;由于其Logo长的比较像一款水果因此&#xff0c;在大家更多的是喜欢称他为水果萝卜&#xff0c;FL studio21是目前最新的版本&#xff0c;这是一款可以让你的计算机就像是一个全功能的录音室&…

影视站用什么cms好?

影视站是指用于提供电影、电视剧、综艺等视频资源的网站。由于影视站需要频繁更新大量的内容&#xff0c;因此使用一个好的内容管理系统&#xff08;CMS&#xff09;非常重要。以下是几个受欢迎的影视站CMS的介绍。最新下载地址&#xff1a;roulang WordPress WordPress是目前…

React 18 state 状态更新函数

参考文章 把一系列 state 更新加入队列 设置组件 state 会把一次重新渲染加入队列。但有时可能会希望在下次渲染加入队列之前对 state 的值执行多次操作。为此&#xff0c;了解 React 如何批量更新 state 会很有帮助。 React 会对 state 更新进行批处理 在下面的示例中&…

Java项目初始化ES、MYSQL表结构及表数据

一、初始化MYSQL数据 public boolean initMysql() throws Exception {log.info("initMysql.start");//获取所连接的数据库名称String database systemMapper.getDatabase();if (StringUtils.isBlank(database)) {throw new BusinessException("连接数据库失败,…

redis学习笔记(八)

文章目录 redis的配置redis的核心配置选项Redis的使用 redis的配置 cat /etc/redis/redis.confredis 安装成功以后,window下的配置文件保存在软件 安装目录下,如果是mac或者linux,则默认安装/etc/redis/redis.conf redis的核心配置选项 绑定ip&#xff1a;访问白名单&#x…

分布式 - 服务器Nginx:一小时入门系列之动静分离

文章目录 1. 动静分离的好处2. 分离静态文件3. 修改 Nginx 配置文件4. location 命令修饰符优先级 1. 动静分离的好处 Apache Tocmat 严格来说是一款java EE服务器&#xff0c;主要是用来处理 servlet请求。处理css、js、图片这些静态文件的IO性能不够好&#xff0c;因此&…