【Vue】Vue3.0(十一)Vue 3.0 中 computed 计算属性概念、使用及示例

news2024/11/30 15:39:12

上篇文章:【Vue】Vue3.0(十)toRefs()和toRef()的区别及使用示例

🏡作者主页:点击!

🤖Vue专栏:点击!

⏰️创作时间:2024年10月15日10点23分

文章目录

  • Vue 3.0中computed计算属性概念、使用及示例
    • 一、概念
    • 二、使用
      • (一)在Composition API中的使用
      • (二)在Options API中的使用(Vue 3.0仍然支持Options API)
    • 三、示例
      • (一)计算购物车商品总价
      • (二)根据用户输入计算表达式结果
      • (三) Vue3.0中最终的一个computed使用示例:(带效果)

Vue 3.0中computed计算属性概念、使用及示例

一、概念

  1. 定义
    • 在Vue 3.0中,computed计算属性是一种根据其他响应式数据(如refreactive定义的数据)计算得出新值的特殊属性。它具有缓存特性,即只有当它所依赖的数据发生变化时才会重新计算,这有助于提高性能,避免不必要的计算开销。
  2. 响应式关联
    • 计算属性会自动追踪其依赖的数据。例如,如果一个计算属性依赖于一个ref创建的响应式数据,当这个ref的数据值改变时,计算属性会感知到这种变化并相应地重新计算。这种响应式关联是Vue 3.0响应式系统的重要组成部分,使得视图能够自动更新以反映数据的变化。

二、使用

(一)在Composition API中的使用

  1. 基本使用步骤
    • 导入相关函数:首先需要从vue模块中导入computedref(如果涉及ref类型的数据)等函数。例如:
    import { ref, computed } from 'vue';
    
    • 定义响应式数据:使用refreactive定义响应式数据,这些数据将作为计算属性的依赖项。例如,使用ref定义一个简单的数字类型的响应式数据:
    const count = ref(0);
    
    • 定义计算属性:在setup函数内部,使用computed函数来定义计算属性。computed函数接受一个函数作为参数,这个函数内部可以访问响应式数据并进行计算。例如:
    const doubleCount = computed(() => {
      return count.value * 2;
    });
    
    • 返回计算属性供模板使用:最后,将计算属性与其他需要在模板中使用的数据一起返回。例如:
    return {
      count,
      doubleCount
    };
    
  2. 完整示例
    import { ref, computed, defineComponent } from 'vue';
    
    export default defineComponent({
      setup() {
        const num = ref(5);
        const square = computed(() => {
          return num.value * num.value;
        });
        return {
          num,
          square
        };
      }
    });
    
    • 在这个示例中,num是一个ref类型的响应式数据,square是一个计算属性,它根据num的值计算出其平方。当num的值发生变化时,square会自动重新计算。

(二)在Options API中的使用(Vue 3.0仍然支持Options API)

  1. 基本使用步骤
    • 在组件的computed选项中定义计算属性。计算属性可以是一个函数或者一个包含getset方法的对象(如果需要可写的计算属性)。例如:
    export default {
      data() {
        return {
          firstName: 'John',
          lastName: 'Doe'
        };
      },
      computed: {
        fullName() {
          return this.firstName + ' ' + this.lastName;
        }
      }
    };
    
    • 这里fullName是一个计算属性,它依赖于data中的firstNamelastName。当firstName或者lastName发生变化时,fullName会自动重新计算。
  2. 完整示例
    import { defineComponent } from 'vue';
    
    export default defineComponent({
      data() {
        return {
          price: 10,
          quantity: 2
        };
      },
      computed: {
        totalPrice() {
          return this.price * this.quantity;
        }
      }
    });
    
    • 在这个示例中,totalPrice是计算属性,它根据pricequantity计算出总价。当price或者quantity发生变化时,totalPrice会重新计算。

三、示例

(一)计算购物车商品总价

  1. Composition API示例
    • 假设购物车中的商品是一个数组,每个商品有price(价格)和quantity(数量)属性,我们要计算购物车中商品的总价。
    import { ref, computed, defineComponent } from 'vue';
    
    export default defineComponent({
      setup() {
        const cart = ref([
          { price: 10, quantity: 2 },
          { price: 15, quantity: 3 }
        ]);
        const totalPrice = computed(() => {
          let sum = 0;
          for (let item of cart.value) {
            sum += item.price * item.quantity;
          }
          return sum;
        });
        return {
          cart,
          totalPrice
        };
      }
    });
    
    • 在这个示例中,cart是一个ref类型的数组,代表购物车中的商品列表。totalPrice是计算属性,它遍历cart中的每个商品,计算出商品的总价。当购物车中的商品的价格或者数量发生变化时,totalPrice会重新计算。

在这个示例中可能有的人会有疑问,为什么这个循环中的单个元素没有 使用.value呢 ?原因如下:

  1. 原因分析
    • 在这段代码中,cart是一个通过ref创建的响应式数据,它包含一个数组,数组中的元素是对象(如{ price: 10, quantity: 2 })。
    • 当使用for...of循环遍历cart.value(这里cart.value是一个普通的非响应式数组)时,item是数组中的每个对象元素,这些对象元素本身不是通过ref创建的响应式数据,而是普通的JavaScript对象。
    • 对于普通的JavaScript对象的属性访问,不需要使用.value。所以在computed函数内部的循环中,item.priceitem.quantity直接访问对象的属性是正确的,不需要加.value
  1. 示例对比

    • 如果pricequantity是通过ref创建的响应式数据,例如:
    const cart = ref([
      { price: ref(10), quantity: ref(2) },
      { price: ref(15), quantity: ref(3) }
    ]);
    const totalPrice = computed(() => {
      let sum = 0;
      for (let item of cart.value) {
        sum += item.price.value * item.quantity.value;
      }
      return sum;
    });
    
    • 在这种情况下,由于pricequantityref类型,就需要使用.value来获取它们的实际值进行计算。
  2. Options API示例

    import { defineComponent } from 'vue';
    
    export default defineComponent({
      data() {
        return {
          cart: [
            { price: 10, quantity: 2 },
            { price: 15, quantity: 3 }
          ]
        };
      },
      computed: {
        totalPrice() {
          let sum = 0;
          for (let item of this.cart) {
            sum += item.price * item.quantity;
          }
          return sum;
        }
      }
    });
    

(二)根据用户输入计算表达式结果

  1. Composition API示例

    • 假设用户在输入框中输入两个数字,我们要计算这两个数字的和、差、积、商(除数不为0)。
    import { ref, computed, defineComponent } from 'vue';
    
    export default defineComponent({
      setup() {
        const num1 = ref(0);
        const num2 = ref(0);
        const sum = computed(() => {
          return num1.value + num2.value;
        });
        const difference = computed(() => {
          return num1.value - num2.value;
        });
        const product = computed(() => {
          return num1.value * num2.value;
        });
        const quotient = computed(() => {
          if (num2.value!== 0) {
            return num1.value / num2.value;
          } else {
            return '除数不能为0';
          }
        });
        return {
          num1,
          num2,
          sum,
          difference,
          product,
          quotient
        };
      }
    });
    
    • 在这个示例中,num1num2ref类型的响应式数据,代表用户输入的两个数字。sumdifferenceproductquotient是计算属性,分别计算两个数字的和、差、积、商。当num1或者num2发生变化时,相应的计算属性会重新计算。
  2. Options API示例

    import { defineComponent } from 'vue';
    
    export default defineComponent({
      data() {
        return {
          num1: 0,
          num2: 0
        };
      },
      computed: {
        sum() {
          return this.num1 + this.num2;
        },
        difference() {
          return this.num1 - this.num2;
        },
        product() {
          return this.num1 * this.num2;
        },
        quotient() {
          if (this.num2!== 0) {
            return this.num1 / this.num2;
          } else {
            return '除数不能为0';
          }
        }
      }
    });
    

(三) Vue3.0中最终的一个computed使用示例:(带效果)

<template>
    <div class="person">
       姓:<input type="text" v-model="firstName"/><br/>
       名:<input type="text" v-model="lastName"/><br/>
       <button @click="changeFullName">将全名修改为li-si</button><br/>
       全名:<span>{{fullName}}</span><br/>
    </div>
</template>

<script lang="ts" setup name="Person">

import { reactive, ref,computed } from 'vue'

let firstName =ref('zhang');
let lastName =ref('san');

//这么定义的计算属性,是只可读取的,不可修改的;
// let fullName = computed(()=>{
//     return firstName.value.slice(0,1).toUpperCase()
//      +firstName.value.slice(1)+'-'+lastName.value;
// })


//这么定义的fullName是一个计算属性,可读可写
let fullName =computed({
    //getter方法
    get(){
        return firstName.value.slice(0,1).toUpperCase()
              +firstName.value.slice(1)+'-'+lastName.value;
    },
    //setter方法
    set(val){
        //在setter中进行实际的修改
        const [str1,str2] =val.split('-');
        firstName.value=str1;
        lastName.value =str2;
        console.log('set', val);
        
    }
})

//修改全名 ,其实是什么也没修改这个方法里面,没有实现fullName的变化,只是引起了set的变化
function changeFullName(){
    fullName.value='li-si';
}
</script>

<style>
.person {
    background-color: skyblue;
    box-shadow: 0 0 10px;
    border-radius: 10px;
    padding: 20px;
}

li {
    font: 1em sans-serif;
}
</style>

未点击修改之前:
在这里插入图片描述
在这里插入图片描述
点击修改之后:
在这里插入图片描述

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

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

相关文章

IDC《中国网络安全软件技术发展路线图,2024》报告身份管理 移动安全推荐厂商

10月9日&#xff0c;全球知名研究与分析机构IDC发布了《IDC TechScape&#xff1a;中国网络安全软件技术发展路线图&#xff0c;2024》报告&#xff0c;深入剖析了中国网络安全软件市场的现状与未来趋势。芯盾时代作为领先的零信任业务安全产品方案提供商&#xff0c;凭借在身份…

FFmpeg 4.3 音视频基础到工程应用-多路H265监控录放C++开发一 : 环境搭建1 vs2019 安装,

一 VS2019安装 https://pan.baidu.com/s/1CtMOM5Zhu-HcHcj611edOg#list/path%2F 密码 p668 二 菜单运行vs2019编译控制台 如果我们要build 32 位的程序&#xff0c;则使用 如果我们要build 64 位的ffmpeg&#xff0c;则使用 x64 Navite Tools Command Prompt for VS 2019 我们…

红日靶机(四)笔记

VulnStack-红日靶机四 概述 这个靶场环境包含了三台机器&#xff0c;一台web&#xff0c;两台window域机器。web服务是使用docker容器搭建的&#xff0c;所以就涉及到docker逃逸。而在获得立足点的过程中&#xff0c;我们要对三个docker容器分别测试&#xff0c;不能漏掉可以…

2012年国赛高教杯数学建模C题脑卒中发病环境因素分析及干预解题全过程文档及程序

2012年国赛高教杯数学建模 C题 脑卒中发病环境因素分析及干预 脑卒中&#xff08;俗称脑中风&#xff09;是目前威胁人类生命的严重疾病之一&#xff0c;它的发生是一个漫长的过程&#xff0c;一旦得病就很难逆转。这种疾病的诱发已经被证实与环境因素&#xff0c;包括气温和湿…

Ubuntu内存扩容

目录 vmware设置Ubuntu设置查看 读研后发现&#xff0c;Ubuntu的使用量直线上升&#xff0c;之前给配置了20g内存&#xff0c;安装了个ros后&#xff0c;没啥内存了。本文实现给Ubuntu扩容。 vmware设置 这里 我使用别人的截图来演示。 我在这里改成了60 Ubuntu设置 sudo a…

Linux基础-进程的超详细讲解(2)_进程的创建

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux基础-进程的超详细讲解(2)_进程的创建与状态 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#…

Python从入门到高手6.4节-字符串格式化详解

目录 6.4.1 理解格式化 6.4.2 使用f-string进行格式化 6.4.3 使用格式化符号进行格式化 6.4.4 使用format方法进行格式化 6.4.5 上山打老虎 6.4.1 理解格式化 同学们比较熟悉的是磁盘格式化&#xff0c;将磁盘格式化以后&#xff0c;磁盘中的文件全部被清除。那么&#x…

数据湖新突破:Hudi让实时数据分析更高效!

开源数据湖对比 Hudi的使用收益 Hudi使用成效 Hudi内部机制 增量摄入与更新 Hudi使用一种混合日志存储模式(称为Copy-on-Write),可以同时处理基础数据文件(Parquet)和增量日志(HoodieLogFile)。以 MergeOnReadTable 的 upsert 操作为例,当有新数据到来时,Hudi会先将数据以行…

ubuntu 虚拟机将linux文件夹映射为windows网络位置

在使用虚拟机时可以选择将windows的文件夹设置为共享文件夹方便在虚拟机中访问windows中的文件,同理,也可以将linux的文件夹共享为一个网络文件夹,通过windows的添加一个网络位置功能,将linux的文件夹映射到windows本地,方便windows访问使用linux的文件夹 参照如下:https://blo…

CMA软件测评实验室如何申请|申请流程、筹备环节、材料清单、资源准备

CMA软件测评实验室资质的申请需要做好哪些准备工作&#xff1f;需要准备哪些材料&#xff1f;本文我们一起来梳理一下CMA软件测评实验室申请流程、准备环节、材料准备以及资源准备。 一、CMA软件测评实验室资质申请流程 1、申请资质认定的检验检测机构&#xff08;以下简称申…

使用OpenRewrite将Java自动升级到Java 21

使用 OpenRewrite 可以实现将Java 项目自动升级到Java 21语法。 基于Maven项目的实现步骤 步骤非常简单&#xff0c; 具体如下&#xff1a; 在pom.xml 中添加如下插件&#xff1a; <project><build><plugins><plugin><groupId>org.openrewri…

第90届CMEF进行中,飞凌嵌入式引领智慧医疗新潮流

2024年10月12日&#xff0c;第90届中国国际医疗器械博览会 (CMEF)在深圳国际会展中心(宝安)开幕&#xff0c;来自全球各地的4000多家展商齐聚一堂&#xff0c;为全球健康产业带来探析前沿、洞见未来的医疗盛宴&#xff0c;飞凌嵌入式在13号馆D01展位隆重亮相。 飞凌嵌入式作为…

经典文献阅读之--GMMCalib(使用基于GMM的联合配准进行激光雷达传感器的外部标定)

0. 简介 现有的激光雷达标定框架主要使用迭代最近点(ICP)及其变体等非概率配准方法。由于它们的成对配准过程以及对初始化和参数化的敏感性&#xff0c;这些方法的结果存在偏差。这通常会导致校准过程中的不校准。概率配准方法通过专门模拟观测值的概率性质来弥补这些缺点。《…

上市公司社会责任报告信息数据(纳税金额、社会捐赠等) 2007-2023年

一、数据指标&#xff1a; 股票代码 统计截止日期 公告日期 所属省份 行业代码 行业名称 纳税总额 每股社会贡献值 社会捐赠额 是否经第三方机构审验 审验机构 是否参照GRI《可持续发展报告指南…

PostGIS:道路网密度分析

道路网密度是评价城市道路网是否合理的基本指标之一,用道路网密度指标来描述区域内的道路长度及平均分布情况,体现城市道路供给水平,其具有统计简单、直观、数据容易获取的优点。另外,通过对不同等级道路网密度的统计还能很好地反映出城市道路等级结构关系,对于方格形城市…

让Activity更加优雅地跳转

公众号「稀有猿诉」 原文链接 让Activity更加优雅地跳转 有过Android开发经验的小伙伴对startActivityForResult以及onActivityResult一定不陌生&#xff0c;正是这一对API让组件 的复用变成可能。今天就来学习一下如何在函数式的范式中驾驭Activity的跳转。 缘起 系…

git的基本操作 + 分支管理

一、基本操作 1. 修改文件 Git比其他的版本管理器设计得更加优秀&#xff0c;因为Git追踪并管理的是修改&#xff0c;而非文件。 修改一个文件&#xff0c;不管你是添加一行&#xff0c;或者删除一行&#xff0c;还是添加了又删除了&#xff0c;甚至你创建了一个新文件&…

《CS:GO》的标志性实验地图在 RTX GPU 神经网络中运行

研究人员让标志性的《CS:GO》地图《Dust 2》完全通过神经网络在单个 RTX 3090 GPU 上模拟运行。 虽然这些片段既令人印象深刻&#xff0c;又问题百出&#xff0c;但它们展示了生成式人工智能在模仿全 3D 游戏环境方面取得的令人敬佩的进展。 该项目的负责人之一埃洛伊-阿隆索&a…

了解CRM外贸管理软件及其应用指南

在全球化的商业环境中&#xff0c;外贸活动显得尤为重要&#xff0c;而有效地管理这些活动则成为企业取得成功的关键之一。CRM外贸管理软件作为一种专门针对外贸企业设计的客户关系管理工具&#xff0c;近年来受到越来越多国际贸易公司的青睐。其中&#xff0c;Zoho CRM作为市场…

Java项目:157 基于springboot技术的美食烹饪互动平台的设计与实现(含论文+说明文档)

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本知识管理系统有管理员和用户两个角色 管理员权限操作的功能包括管理美食&#xff0c;对美食留言进行回复&#xff0c;管理美食知识信息&…