vue3-计算属性

news2024/9/22 13:35:19

计算属性

模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。

  • 根据作者今年是否看过书展示不同信息

<script lang="ts" setup>
import { ref, reactive } from "vue"

const author = reactive({
    name: 'John Doe',
    books: [
        '老人与海',
        '百年孤独',
        '丧钟为谁而鸣'
    ]
})

</script>

<template>
    <div class="container">
        <p>2024是否有看过书籍:</p>
        <span>{{ author.books.length > 0 ? 'Yes' : 'No' }}</span>
    </div>
</template>

<style lang="scss" scoped>
.container {}
</style>

效果:

  • 这样判断使模版逻辑看起来比较复杂

因此我们推荐使用计算属性来描述依赖响应式状态的复杂逻辑

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

const author = reactive({
    name: 'John Doe',
    books: [
        '老人与海',
        '百年孤独',
        '丧钟为谁而鸣'
    ]
})

const publishedBooksMessage = computed(() => {
    return author.books.length > 0 ? 'Yes' : 'No'
})

</script>

<template>
    <div class="container">
        <p>2024是否有看过书籍:</p>
        <span>{{ publishedBooksMessage }}</span>
    </div>
</template>

<style lang="scss" scoped>
.container {}
</style>
  1. 我们在这里定义了一个计算属性 publishedBooksMessage。computed() 方法期望接收一个 getter 函数,返回值为一个计算属性 ref。和其他一般的 ref 类似,你可以通过 publishedBooksMessage.value 访问计算结果。计算属性 ref 也会在模板中自动解包,因此在模板表达式中引用时无需添加 .value。

  2. Vue 的计算属性会自动追踪响应式依赖。它会检测到 publishedBooksMessage 依赖于 author.books,所以当 author.books 改变时,任何依赖于 publishedBooksMessage 的绑定都会同时更新。

计算属性缓存 vs 方法

  • 使用方法实现上述功能

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

  ...
  ...
  
  <p>{{ calculateBooksMessage() }}</p>
  
  ...
  ...
  

区别:

  1. 计算属性值会基于其响应式依赖被缓存,一个计算属性仅会在其响应式依赖更新时才重新计算。这意味着只要 author.books 不改变,无论多少次访问 publishedBooksMessage 都会立即返回先前的计算结果,而不用重复执行 getter 函数。

  2. 方法调用总是会在重渲染发生时再次执行函数

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

可写计算属性

  • 计算属性默认是只读的。

  • 当你尝试修改一个计算属性时,你会收到一个运行时警告。

  • 只在某些特殊场景中你可能才需要用到“可写”的属性,你可以通过同时提供 getter 和 setter 来创建:

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

const firstName = ref('张')
const lastName = ref('三')

const fullName = computed({
    // getter
    get() {
        return firstName.value + ' ' + lastName.value
    },
    // setter
    set(newValue) {
        // 注意:我们这里使用的是解构赋值语法
        [firstName.value, lastName.value] = newValue.split(' ')
    }
})

// 赋值后会执行 计算属性的 setter 方法 从而改变 firstName 和 lastName 的值
const changeName = () => {
    // 不推荐这么做 避免直接修改计算属性值 
    fullName.value = '张 四'
    // 推荐 应该更新它所依赖的源状态以触发新的计算
    // lastName.value = '四'
}

</script>

<template>
    <div class="container">
        <button class="button" @click="changeName">点击改名名字</button>
        <p>{{ fullName }}</p>
    </div>
</template>

<style lang="scss" scoped>
.container {}
</style>
  • 现在当你再运行 fullName.value = '张 四' 时,setter 会被调用而 firstName 和 lastName 会随之更新。

注意:这里是做演示并不推荐计算属性修改,除非特殊需要

解构赋值语法是一种 Javascript 表达式。可以将数组中的值或对象的属性取出,赋值给其他变量。

let a, b, rest;
[a, b] = [10, 20];

console.log(a);
// 输出: 10

console.log(b);
// 输出: 20

//... 扩展运算符 
// 将剩余的值 赋值给rest变量 就这个意思
// 函数上使用就是多参数 比如 function f1(...args)
[a, b, ...rest] = [10, 20, 30, 40, 50];

console.log(rest);
// 输出: Array [30, 40, 50]

最佳实践

  1. Getter 不应有副作用

  • 计算属性的 getter 应只做计算而没有任何其他的副作用,这一点非常重要,请务必牢记。

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

  1. 避免直接修改计算属性值

  • 从计算属性返回的值是派生状态。可以把它看作是一个“临时快照”,每当源状态发生变化时,就会创建一个新的快照。

  • 更改快照是没有意义的,因此计算属性的返回值应该被视为只读的,并且永远不应该被更改——应该更新它所依赖的源状态以触发新的计算。

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

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

相关文章

java实现局域网内视频投屏播放(五)视频搜索和投屏自动切换下一个

代码链接 这次对ui做了一些调整&#xff0c;整体分成了5个类别分别为 搜索设备播放任务已下载视频列表视频搜索下载任务列表 视频搜索 搜索 点击搜索后&#xff0c;会从执行所有VideoResolver实现类的search方法&#xff0c;将搜索到的结果汇总到一起&#xff0c;根据视频的…

设计模式⑤ :一致性

一、前言 有时候不想动脑子&#xff0c;就懒得看源码又不像浪费时间所以会看看书&#xff0c;但是又记不住&#xff0c;所以决定开始写"抄书"系列。本系列大部分内容都是来源于《 图解设计模式》&#xff08;【日】结城浩 著&#xff09;。该系列文章可随意转载。 …

node-sass@4.7.2 postinstall: `node scripts/build.js`

Can‘t find Python executable “D:\Python36\python.EXE“, you can set the PYTHON env variable.-CSDN博客 gyp ERR! build error gyp ERR! stack Error: C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe failed with exit code: 1 gyp ERR! stack at Chil…

【DDR】基于Verilog的DDR控制器的简单实现(一)——初始化

在FPGA中&#xff0c;大规模数据的存储常常会用到DDR。为了方便用户使用&#xff0c;Xilinx提供了DDR MIG IP核&#xff0c;用户能够通过AXI接口进行DDR的读写访问&#xff0c;然而MIG内部自动实现了许多环节&#xff0c;不利于用户深入理解DDR的底层逻辑。 本文以美光(Micro…

使用emu8086实现——顺序程序设计

一、实验目的 1. 掌握顺序程序设计方法 2. 掌握汇编语言编程设计方法。 二、实验内容 1.用查表的方法将一位十六进制数转换成它相应的ASCII码。 代码及注释&#xff1a; Data segment ;定义数据段Tab db 30h,31h,32h,33h,34h,35,36h,37h,38h,39h ;定义一个Tab的字节型…

云卷云舒:AI for DB、DB for AI

云卷云舒&#xff1a;算力网络云原生&#xff08;下&#xff09;&#xff1a;云数据库发展的新篇章-CSDN博客https://blog.csdn.net/bishenghua/article/details/135050556 随着数据库和AI技术的分支同向演进&#xff0c;AI 和数据库间的关联越发紧密了。 大模型的演进发展&a…

mybatisplus配置

一、新建项目&#xff1a;com.saas.plusdemo 二、配置pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sch…

借助Gitee将typora图片上传CSDN

概述 前面已经发了一个如何借助Github将typora上的图片上传到csdn上&#xff0c;但这有个缺陷&#xff1a;需要科学上网才能加速查看已经上传到github上的图片&#xff0c;否则就会出现已经上传的图片&#xff0c;无法正常查看的问题 如何解决&#xff1f; 那就可以使用Gite…

WEB 3D技术 three.js 聚光灯

本文 我们来说说 点光源和聚光灯 点光源 就像一个电灯泡一样 想四周发散光 而聚光灯就像手电筒一样 像一个方向射过去 距离越远范围越大 光越弱 我们先来看一个聚光灯的效果 我们可以编写代码如下 import ./style.css import * as THREE from "three"; import { O…

陪诊小程序|北京陪诊系统满足医疗陪诊需求的便捷工具

陪诊小程序是一种创新的线上医疗服务工具&#xff0c;旨在为用户提供便捷的医疗陪诊服务。通过陪诊小程序&#xff0c;用户可以轻松预约陪诊服务&#xff0c;选择合适的服务时间和医院科室&#xff0c;并了解服务详情和其他用户的评价。同时&#xff0c;陪诊员也可以利用小程序…

二、Sharding-JDBC系列02:自定义主键生成策略

目录 一、概述 二、自定义主键生成策略 (1)、自定义MyShardingKeyGenerator (2)、SPI接口配置 (3)、配置主键ID生成策略 (4)、测试数据插入 一、概述 实际应用中&#xff0c;大部分场景按照MySQL主键ID自增就能满足需求&#xff0c;但是在分库分表后&#xff0c;MySQL的…

弟12章 1 网络编程

文章目录 网络协议概述 p164TCP协议与UDP协议的区别 p165 网络协议概述 p164 ipv4&#xff1a;十进制点分制 ipv6&#xff1a;十六进制冒号分隔 TCP协议与UDP协议的区别 p165 tcp协议的三次握手&#xff1a;

双向冒泡排序的数据结构实验报告

目录 实验目的&#xff1a; 实验内容&#xff08;实验题目与说明&#xff09; 算法设计&#xff08;核心代码或全部代码&#xff09; 运行与测试&#xff08;测试数据和实验结果分析&#xff09; 总结与心得&#xff1a; 实验目的&#xff1a; 理解双向冒泡排序算法的原…

FreeRTOS 学习相关笔记 附C语言内容补充

学习视频为【正点原子】手把手教你学FreeRTOS实时系统 文章目录 RTOS 入门裸机RTOSFreeRTOS任务调度方式任务状态 FreeRTOS 移植系统配置文件 API函数任务创建和删除动态方式创建任务静态方式创建任务删除任务 任务挂起和恢复函数调度器挂起与恢复临界区任务调度器的挂起和恢复…

估算监控最低可以存储的时长

监控可以存储的时长&#xff0c;主要取决于码率&#xff0c;知道了码率就知道一天可以的视频产生多少视频数据。 以乐橙官网给出的计算&#xff0c;我们可以推出这个设备8MP本地的录像码率大概在4Mbps左右。 同样的我们这里附一张表格&#xff0c;大家可以根据这个来估算存储…

leetcode14. 最长公共前缀

题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 “”。 解题方法&#xff1a; 1.首先找到数组中长度最短的数据&#xff0c;与数组第一个数进行交换&#xff08;公共前缀的长度肯定不会大于列表中长度最短的字符串&#x…

大模型实战营Day3 作业

基础作业&#xff1a; 复现课程知识库助手搭建过程 (截图) 进阶作业&#xff1a; 选择一个垂直领域&#xff0c;收集该领域的专业资料构建专业知识库&#xff0c;并搭建专业问答助手&#xff0c;并在 OpenXLab 上成功部署&#xff08;截图&#xff0c;并提供应用地址&#xf…

pyenv虚拟环境安装和配合pipenv多版本创建

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、下载配置pyenv二、配置多版本虚拟环境总结 前言 最近公司编写了一个自动化用例编写软件&#xff0c;需要适配win7和win10系统&#xff0c;需要同时编译3.8…

Nacos和Eureka比较、统一配置管理、Nacos热更新、多环境配置共享、Nacos集群搭建步骤

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Nacos和eureka的对比二、统一配置管理二、Nacos热更新方式一方式二 三、多环境配置共享四、Nacos集群搭建步骤&#xff08;黑马springCloud的p29&#xff0…

如何实现接口重试

重试机制 在复杂的接口业务中&#xff0c;API请求数量很多&#xff0c;并且业务处理复杂&#xff0c;便难免会遇到一些网络问题(timeout)或者未知错误(error)&#xff0c;这时候需要加入重试机制了。让我们来回顾一下都有什么实现机制吧。 8种重试机制实现 1. 循环重试 这是最…