vue3.0(七) 计算属性(computed)

文章目录

  • 1 计算属性(computed )
    • 1.1 computed使用
    • 1.2 computed使用场景
    • 1.4 computed的注意点
    • 1.4 computed的原理
    • 1.5 computed的示例
  • computed 和 Methods 的区别


1 计算属性(computed )

在 Vue 3 中,computed 是一个用于创建计算属性的工具,它基于组件的响应式依赖进行复杂的计算,并返回一个新的响应式引用。计算属性是 Vue 的一个核心概念,它提供了一种声明式的方式来执行基于其依赖的响应式数据的计算。

1.1 computed使用

计算属性与常规属性类似,但是它们是基于它们的依赖进行缓存的。只有当计算属性依赖的响应式数据发生变化时,它们才会重新求值。
只要依赖没有变化,多次访问计算属性会立即返回之前缓存的结果,而不会重新执行计算逻辑。

<template>
  <div>原始数据{{ count }}</div>
  <div>计算属性数据{{ comCount }}</div>
  <button @click="updateCount">修改数据</button>
</template>
<script lang="ts">
import { defineComponent, ref, computed } from 'vue'
export default defineComponent({
  setup () {
    const count = ref<number>(0)
    const comCount = computed(() => count.value * 3)
    const updateCount = () => {
      count.value++
    }
    return {
      count,
      comCount,
      updateCount
    }
  }
})
</script>

上述代码执行效果

  • count 是一个响应式数据,而 doubleCount 是一个计算属性,它返回 count 的三倍。当 count 的值发生变化时,doubleCount 会自动更新。
  • 使用计算属性的好处是它们能够减少不必要的计算和渲染,提高性能。此外,它们还使得组件的逻辑更加清晰和易于维护。

1.2 computed使用场景

  1. 对数据进行格式化
    从响应式数据中派生出一个经过计算或转换的新值时,可以使用 computed。
    <template>
      <--! 2024/5/13 -->
      <div>{{ formattedDate }}</div>
    </template>
    <script lang="ts">
    import { defineComponent, ref, computed } from 'vue'
    export default defineComponent({
      setup () {
        const date = ref(new Date())
        console.log(date.value) // Mon May 13 2024 15:32:56 GMT+0800 (中国标准时间)
        const formattedDate = computed(() => {  
          return date.value.toLocaleDateString()
        })
    
        return {
          formattedDate
        }
      }
    })
    </script>
    
  2. 依赖多个数据源的属性并对数据进行计算
    多个响应式数据项,并且当这些数据项中的任何一个改变时,你都希望重新计算该属性
    <template>
      <div>{{ totalPrice }}</div>
    </template>
    <script lang="ts">
    import { defineComponent, ref, computed } from 'vue'
    
    export default defineComponent({
      setup () {
        const num = ref(2) 
        const price = ref(10)
        const totalPrice = computed(() => {  
          return num.value * price.value
        })
        return {
          totalPrice
        }
      }
    })
    </script>
    
  3. 减少模板中的复杂逻辑, 过滤和排序, 计算
    在模板中直接编写复杂的逻辑表达式可能会导致代码难以阅读和维护。
    import { computed, reactive } from 'vue'
    const state = reactive({
      todos: [
        { id: 1, text: '学习Vue3', done: false },
        { id: 2, text: '学习React', done: false },
        { id: 3, text: '学习Angular', done: true }
      ]
    })
    const totalTodos = computed(() => {
      return state.todos.length
    })
    const completedTodos = computed(() => {
      return state.todos.filter(todo => todo.done).length
    })
    console.log(totalTodos.value) // 输出:3
    console.log(completedTodos.value) // 输出:1
    

1.4 computed的注意点

  1. 计算属性应该是纯函数:计算属性的值应该只依赖于其他响应式数据,而不应该有副作用。

  2. 不要在计算属性内部修改数据:计算属性的“getter”函数应该只返回计算的值,而不应该在内部修改依赖的数据。这样会导致无限循环更新。

  3. 对于复杂的计算,考虑使用方法或Watchers:如果计算涉及复杂逻辑或异步操作,可能需要考虑使用方法或Watchers来替代计算属性。

1.4 computed的原理

computed函数的原理主要是基于Vue的响应式系统,通过getter和setter函数来创建和管理计算属性。

  1. 响应式依赖收集:当在组件中定义计算属性时,Vue会为该计算属性创建一个getter函数。这个getter函数的作用就是返回计算属性的值。在getter函数执行的过程中,它可能会访问其他响应式数据(如data中的属性或props等)。当getter函数访问这些响应式数据时,Vue的响应式系统会记录下这些依赖关系,即计算属性依赖于哪些响应式数据。

  2. 缓存机制:计算属性的关键特性是它具有缓存机制。只要计算属性所依赖的响应式数据没有发生变化,那么多次访问计算属性时,都会直接返回之前计算并缓存的结果,而不会重新执行getter函数中的计算逻辑。这种缓存机制大大提高了性能,避免了不必要的重复计算

  3. 依赖更新与重新计算:当计算属性所依赖的响应式数据发生变化时,Vue的响应式系统会触发依赖更新。这个过程会标记计算属性为“脏”状态,表示其值可能不再是最新的。在下一个组件更新周期中,Vue会重新执行计算属性的getter函数,以获取最新的计算结果,并更新缓存。这样,组件中绑定计算属性的地方就能显示最新的数据。

  4. Setter函数:虽然大多数情况下我们主要关注计算属性的getter函数,但computed属性实际上也支持setter函数。setter函数在计算属性的值被显式修改时调用。然而,在实际开发中,我们通常会避免直接修改计算属性的值,因为这样会破坏其响应式依赖和缓存机制。如果需要修改计算属性的值,通常应该修改它所依赖的原始响应式数据。

1.5 computed的示例

  1. 创建一个只读的计算属性 ref:

     const count = ref<number>(0)
     const plusOne = computed(() => count.value + 1)
     console.log(plusOne.value) // 2
     plusOne.value++ // 错误
    

    ee92445b.png

  2. 创建一个可写的计算属性 ref:

    const count = ref(1)
    const plusOne = computed({
      get: () => count.value + 1,
      set: (val) => {
        count.value = val - 1
      }
    })
    
    plusOne.value = 1
    console.log(count.value) // 0
    
  3. 调试:
    computed() 传入第二个参数,是一个包含了 onTrack 和 onTrigger 两个回调函数的对象:

    const plusOne = computed(() => count.value + 1, {
      onTrack(e) {
        console.log('当 count.value 被追踪为依赖时触发');
      },
      onTrigger(e) {
        console.log('count.value 被更改时触发');
      }
    })
    

computed 和 Methods 的区别

  1. Methods 是一种以命令式的方式处理数据的方式。在 Vue 实例中定义 methods 属性或在组件中使用 methods 选项来创建方法。

    methods 方法可以接受参数,并根据参数进行相应的操作。每次调用方法时,都会执行其中的代码并返回结果。
    Methods 的使用场景包括:
    事件处理:当需要处理用户交互事件时,可以使用方法。例如,点击按钮时执行特定的操作。
    复杂逻辑:当需要执行复杂的业务逻辑,或者需要进行条件判断和循环操作时,可以使用方法。
    需要注意的是,每次调用方法时,都会执行其中的代码,不会进行缓存。因此,如果方法中包含复杂的计算逻辑或者涉及频繁调用的场景,可能会对性能产生影响。

  2. 响应方式:Computed 根据依赖的数据进行缓存,只有在依赖数据变化时才重新计算;而 Methods 每次调用时都会执行其中的代码。
  3. 缓存机制:Computed 具有缓存机制,只有在依赖数据变化时才重新计算;而 Methods 每次调用都会执行其中的代码。
  4. 使用场景:Computed 适用于根据已有数据衍生新的数据和数据过滤/转换场景,并具有缓存机制提高性能;Methods 适用于处理事件和复杂逻辑的场景。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【AI大模型】自动生成红队攻击提示--GPTFUZZER

本篇参考论文为&#xff1a; Yu J, Lin X, Xing X. Gptfuzzer: Red teaming large language models with auto-generated jailbreak prompts[J]. arXiv preprint arXiv:2309.10253, 2023. https://arxiv.org/pdf/2309.10253 一 背景 虽然LLM在今天的各个领域得到了广泛的运用…

Nginx安全扫描借助lua-nginx-module模块增加授权

一、问题描述 某次安全扫描通过Dirsearch工具发现&#xff0c;nginx代理访问某后端业务时&#xff0c;发现&#xff1a;Springboot未授权漏洞&#xff0c;存在信息泄露风险&#xff0c;危险等级&#xff1a;中危&#xff1b; 相关资源&#xff1a;openresty官网、/lua-nginx-m…

结构体补充-位段

文章目录 位段介绍位段内存分配位段的使用注意事项结束 位段介绍 为什么会有位段呢? 我们直到一个int是4个字节表示32个bit位,但是比如2,3这样的整数,我们只需要2个bit位就可以了,那30个比特位不就是浪费掉了吗,所以位段就产生了 位段通过结构体来实现&#xff0c;位段表示方法…

Hive表数据优化

Hive表数据优化 1.文件格式 为Hive表中的数据选择一个合适的文件格式&#xff0c;对提高查询性能的提高是十分有益的。 &#xff08;1&#xff09;Text File 文本文件是Hive默认使用的文件格式&#xff0c;文本文件中的一行内容&#xff0c;就对应Hive表中的一行记录。 可…

C++之Eigen库基本使用(下)

1、常见变换 Eigen::Matrix3d //旋转矩阵&#xff08;3*3&#xff09; Eigen::AngleAxisd //旋转向量&#xff08;3*1&#xff09; Eigen::Vector3d //欧拉角&#xff08;3*1&#xff09; Eigen::Quaterniond //四元数&#xff08;4*1&#xff09; Eigen::Isom…

K8s:二进制安装k8s(单台master)

目录 一、安装k8s 1、拓扑图 2、系统初始化配置 2.1关闭防火墙selinx以及swap 2.2设置主机名 2.3在每台主机中添加hosts&#xff0c;做映射 2.4调整内核参数&#xff0c;将桥接的ipv4流量传递到iptables&#xff0c;关闭ipv6 2.4时间同步 3、部署docker引擎&#xff0…

【Kali Linux工具篇】wpscan的基本介绍与使用

介绍 WPScan是Kali Linux默认自带的一款漏洞扫描工具&#xff0c;它采用Ruby编写&#xff0c;能够扫描WordPress网站中的多种安全漏洞&#xff0c;其中包括主题漏洞、插件漏洞和WordPress本身的漏洞。最新版本WPScan的数据库中包含超过18000种插件漏洞和2600种主题漏洞&#x…

力扣【旋转函数】python

如果直接用暴力的话&#xff0c;只能过4个样例好像&#xff0c;超时 因此得用递推公式 F1F0前n-1个数-(n-1)*第n个数 F0sum(nums)-n*第n个数 nlen(nums) ans[]#定义一个存最大值值的列表 ss sum(nums) dm 0 for j in range(n):dm j * nums[j] ans.append(dm) print(dm) n…

MinIO学习笔记

MINIO干什么用的&#xff1a; AI数据基础设施的对象存储 为人工智能系统提供数据支持&#xff0c;数据存储&#xff1b;对象存储&#xff08;Object Storage&#xff09;是一种数据存储架构&#xff0c;它以对象为单位来处理、存储和检索数据&#xff0c;每个对象都包含了数据本…

GitHub和huggingface镜像网站

GitHub镜像网站 gitclone 如果网络原因打不开GitHub的话&#xff0c;可以用这个网站进行克隆项目&#xff0c;将克隆代码修改一下 git clone https://github.com/comfyanonymous/ComfyUI.git 修改 git clone https://gitclone.com/github.com/comfyanonymous/ComfyUI.git 这个…

JSON在线解析及格式化验证 - JSON.cn网站

JSON在线解析及格式化验证 - JSON.cn https://www.json.cn/

docker八大架构之应用服务集群架构

应用服务集群架构 在之前&#xff0c;一个应用层要负责所有的用户操作&#xff0c;但是有时用户增加后就会导致供不应求的现象&#xff08;单个应用不足以支持海量的并发请求&#xff0c;高并发的时候站点响应变慢&#xff09;&#xff0c;这时就需要增加应用层服务器&#xf…

自动驾驶占据感知的综述:信息融合视角

24年5月香港理工的论文“A Survey on Occupancy Perception for Autonomous Driving: The Information Fusion Perspective“。 3D 占据感知技术旨在观察和理解自动驾驶车辆的密集 3D 环境。该技术凭借其全面的感知能力&#xff0c;正在成为自动驾驶感知系统的发展趋势&#x…

简单实现---基于STL的演讲比赛流程管理系统(C++实现)

前言 事先声明&#xff1a;本文章中编写的代码仅用于学习算法思想和编写基础形式使用&#xff0c;并未进行太多的代码优化&#xff0c;因此&#xff0c;若需要对代码进行优化以及异常处理的小伙伴们&#xff0c;可自行添加相关操作&#xff0c;谢谢&#xff01; 一、题…

绘图软件 excalidraw 部署流程 [ Ubuntu 22.4已验证 ]

文章目录 前置一、修改DNS二、添加docker 镜像三、pull excalidraw/excalidraw四、启动一个docker五、访问 简介&#xff1a;这篇文章介绍的是一份开源的绘图软件的部署过程 前置 安装docker&#xff1a;Ubuntu 系统&#xff0c;Docker 安装步骤 [Ubuntu 22.4已验证] 其他系…

回炉重造java----JVM

为什么要使用JVM ①一次编写&#xff0c;到处运行&#xff0c;jvm屏蔽字节码与底层的操作差异 ②自动内存管理&#xff0c;垃圾回收功能 ③数组下边越界检查 ④多态 JDK&#xff0c;JRE&#xff0c;JVM的关系 JVM组成部分 JVM的内存结构 《一》程序计数器(PC Register) 作用…

谷歌Gboard应用的语言模型创新:提升打字体验的隐私保护技术

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

浦语大模型笔记

书生浦语大模型全链路开源体系 浦语大模型全链路开源体系大模型成为发展通用人工智能的重要途径书生浦语 2.0&#xff08;InternLM2&#xff09;核心理念书生浦语 2.0&#xff08;InternLM2&#xff09;的主要亮点主要亮点 1&#xff1a;超长上下文支持主要亮点 2&#xff1a;性…

网络库-libevent介绍

1.简介 libevent是一个事件驱动的网络库&#xff0c;主要用于构建可扩展的网络服务器。它提供了跨平台的API&#xff0c;支持多种事件通知机制&#xff0c;如select、poll、epoll、kqueue等。 主要组件 event: 表示一个具体的事件&#xff0c;包括事件类型、事件回调等。eve…

大模型管理工具:SWIFT

目录 一、SWIFT 介绍 二、SWIFT 安装 2.0 配置环境(可选) 2.1 使用pip进行安装 2.2 源代码安装 2.3 启动 WEB-UI 三、部署模型 3.0 deploy命令参数 3.1 原始模型 3.2 微调后模型 一、SWIFT 介绍 SWIFT&#xff08;Scalable lightWeight Infrastructure for Fine-Tuni…