Vue——计算属性

news/2024/12/2 6:32:06/

目录

一、基础示例​

二、计算属性缓存 vs 方法​

三、可写计算属性​

四、最佳实践​

Getter 不应有副作用​

避免直接修改计算属性值​


一、基础示例​

模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。比如说,我们有这样一个包含嵌套数组的对象:

export default {data() {return {author: {name: 'John Doe',books: ['Vue 2 - Advanced Guide','Vue 3 - Basic Guide','Vue 4 - The Mystery']}}}
}

我们想根据 author 是否已有一些书籍来展示不同的信息:

<p>Has published books:</p>
<span>{{ author.books.length > 0 ? 'Yes' : 'No' }}</span>

这里的模板看起来有些复杂。我们必须认真看好一会儿才能明白它的计算依赖于 author.books。更重要的是,如果在模板中需要不止一次这样的计算,我们可不想将这样的代码在模板里重复好多遍。

因此我们推荐使用计算属性来描述依赖响应式状态的复杂逻辑。这是重构后的示例:

export default {data() {return {author: {name: 'John Doe',books: ['Vue 2 - Advanced Guide','Vue 3 - Basic Guide','Vue 4 - The Mystery']}}},computed: {// 一个计算属性的 getterpublishedBooksMessage() {// `this` 指向当前组件实例return this.author.books.length > 0 ? 'Yes' : 'No'}}
}
<p>Has published books:</p>
<span>{{ publishedBooksMessage }}</span>

我们在这里定义了一个计算属性 publishedBooksMessage

更改此应用的 data 中 books 数组的值后,可以看到 publishedBooksMessage 也会随之改变。

在模板中使用计算属性的方式和一般的属性并无二致。Vue 会检测到 this.publishedBooksMessage 依赖于 this.author.books,所以当 this.author.books 改变时,任何依赖于 this.publishedBooksMessage 的绑定都将同时更新。

二、计算属性缓存 vs 方法​

你可能注意到我们在表达式中像这样调用一个函数也会获得和计算属性相同的结果:

<p>{{ calculateBooksMessage() }}</p>
// 组件中
methods: {calculateBooksMessage() {return this.author.books.length > 0 ? 'Yes' : 'No'}
}

若我们将同样的函数定义为一个方法而不是计算属性,两种方式在结果上确实是完全相同的,然而,不同之处在于计算属性值会基于其响应式依赖被缓存。一个计算属性仅会在其响应式依赖更新时才重新计算。这意味着只要 author.books 不改变,无论多少次访问 publishedBooksMessage 都会立即返回先前的计算结果,而不用重复执行 getter 函数。

这也解释了为什么下面的计算属性永远不会更新,因为 Date.now() 并不是一个响应式依赖:

computed: {now() {return Date.now()}
}

相比之下,方法调用总是会在重渲染发生时再次执行函数。

为什么需要缓存呢?想象一下我们有一个非常耗性能的计算属性 list,需要循环一个巨大的数组并做许多计算逻辑,并且可能也有其他计算属性依赖于 list。没有缓存的话,我们会重复执行非常多次 list 的 getter,然而这实际上没有必要!如果你确定不需要缓存,那么也可以使用方法调用。

三、可写计算属性​

计算属性默认是只读的。当你尝试修改一个计算属性时,你会收到一个运行时警告。只在某些特殊场景中你可能才需要用到“可写”的属性,你可以通过同时提供 getter 和 setter 来创建:

export default {data() {return {firstName: 'John',lastName: 'Doe'}},computed: {fullName: {// getterget() {return this.firstName + ' ' + this.lastName},// setterset(newValue) {// 注意:我们这里使用的是解构赋值语法[this.firstName, this.lastName] = newValue.split(' ')}}}
}

现在当你再运行 this.fullName = 'John Doe' 时,setter 会被调用而 this.firstName 和 this.lastName 会随之更新。

四、最佳实践​

Getter 不应有副作用​

计算属性的 getter 应只做计算而没有任何其他的副作用,这一点非常重要,请务必牢记。举例来说,不要在 getter 中做异步请求或者更改 DOM!一个计算属性的声明中描述的是如何根据其他值派生一个值。因此 getter 的职责应该仅为计算和返回该值。在之后的指引中我们会讨论如何使用监听器根据其他响应式状态的变更来创建副作用。

避免直接修改计算属性值​

从计算属性返回的值是派生状态。可以把它看作是一个“临时快照”,每当源状态发生变化时,就会创建一个新的快照。更改快照是没有意义的,因此计算属性的返回值应该被视为只读的,并且永远不应该被更改——应该更新它所依赖的源状态以触发新的计算。


http://www.ppmy.cn/news/40447.html

相关文章

SpringBoot + MyBatisPlus实现Yaml配置参数AES算法加密

文章目录SpringBoot MyBatisPlus实现Yaml配置参数AES算法加密1概述2 密钥加密3 Yaml参数配置4 使用方式SpringBoot MyBatisPlus实现Yaml配置参数AES算法加密 1概述 该功能为了保护数据库配置及数据安全&#xff0c;在一定的程度上控制开发人员流动导致敏感信息泄露。Mybati…

网络安全从业人员应该如何提升自身的web渗透能力?

前言 web 渗透这个东西学起来如果没有头绪和路线的话&#xff0c;是非常烧脑的。 理清 web 渗透学习思路&#xff0c;把自己的学习方案和需要学习的点全部整理&#xff0c;你会发现突然渗透思路就有点眉目了。 程序员之间流行一个词&#xff0c;叫 35 岁危机&#xff0c;&am…

归并排序(非递归实现) 计数排序

上一期我们说了归并排序的递归是如何实现的&#xff0c;但是递归如果层次太多的话容易栈溢出&#xff0c;所以我们还需要掌握非递归的实现&#xff0c;但是我们非递归需要如何实现&#xff1f; 下面我们就来看一下非递归的实现 归并排序的非递归实现他并不需要栈队列这些东西…

有趣的小知识(四)从基站到天线:深入了解如何优化网站速度的关键技术

一、全面认识基站 1.1 基站的定义 基站是一种通信设施&#xff0c;用于提供无线通信服务。它通常由一座塔、天线、收发信设备、电源和辅助设备等组成&#xff0c;可以与移动设备&#xff08;如手机、平板电脑等&#xff09;进行无线通信。基站是是无线终端(如手机)接入互联网…

IDEA虚拟机参数配置【自我总结】

idea内存溢出问题 最近自己在跑一个大一点的微服务项目时候,发生了这样的一个现象,就是启动idea的时候,首先发现电脑的CPU小风扇急速的飞转,电脑的运行内存也快要飙升到100%了,而且最重要的是光是加载项目就加载了几分钟啊(我当时就炸锅锅)像下图一样,一直加载一直加载 想了想,…

Response输出字符流(中文乱码问题及解决办法)

目录代码中文乱码原因解决办法1. 获取流对象之前&#xff0c;设置流的编码&#xff0c;由默认编码ISO-8859-1设置为GBK2.告诉浏览器&#xff0c;服务器发送的消息体数据的编码。建议浏览器使用该编码解码3.更简便的方法&#xff08;重点&#xff09;最终代码代码 步骤 获取字符…

DnCNN-pytorch版本代码运行环境配置

一、DnCNN-pytorch相关下载 (1)DnCNN-pytorch版本代码下载 https://download.csdn.net/download/qq_41104871/87457414 (2)GPU版本的torch0.4.1下载 https://download.csdn.net/download/qq_41104871/87658469 (3)相对应的torchvision0.2.1下载 https://download.csdn…

whisper 语音识别AI 声音To文字

whisper介绍 Whisper 是一个由 OpenAI 训练并开源的神经网络&#xff0c;功能是语音识别,能把语音转换为文字,在英语语音识别方面的稳健性和准确性接近人类水平。 1、Whisper支持语音转录和翻译两项功能并接受各种语音格式&#xff0c;模型中、英、法、德、意、日等主流语言上…