03.vue3的计算属性

news2024/11/20 18:36:49

文章目录

    • 1.计算属性
      • 1.get()和set()
      • 2.computed的简写
      • 3.computed和methods对比
    • 2.相关demo
      • 1.全选和反选
      • 2.todos列表

1.计算属性

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。所以,对于任何包含响应式数据的复杂逻辑,你都应该使用计算属性

简单来说计算属性可以理解为:要用的属性不存在,要通过已有属性计算得来.底层借助了Object.defineproperty方法提供的getter和setter。

1.get()和set()

计算属性默认有自己的get()和set().

get()属性有以下特点:

(1).初次读取时会执行一次。
(2).当依赖的数据发生改变时会被再次调用。

set()属性的特点:

(1)当给计算属性设置值的时候会触发set()

(2)如果计算属性要被修改,那必须写set函数去响应修改,set函数可以接收用户修改计算属性的值

<template>
  <div>
    <h3>computed计算属性</h3>
    <input type="text" v-model="firstName"> -
    <input type="text" v-model="lastName"> = 
    <input type="text" v-model="fullName">
  </div>
</template>
<script setup>
import {ref,reactive,computed} from "vue"
  const firstName=ref("马");
  const lastName=ref("丽");
const fullName=computed({
  get(){
    console.log("get被调用了");
    return  firstName.value+'-'+lastName.value
  },
  set(value){
    console.log("set被触发了");
    //根据fullname的值重新设置firstName和lastName
    const newArr=value.split("-");
    firstName.value=newArr[0];
    lastName.value=newArr[1];
  }
})
</script>

2.computed的简写

在多数情况下我们只考虑读取不考虑修改,可以把set部分删掉,直接改写成函数的形式.

计算属性最终会出现在实例上,直接读取使用即可,不需要()调用

<template>
  <div>
    <h3>computed计算属性</h3>
    <input type="text" v-model="firstName"> -
    <input type="text" v-model="lastName"> = 
    <input type="text" v-model="fullName">
      
    <p><input type="text" v-model="str"> </p>
    <h3>反转字符串:{{reverseStr}}</h3>
  </div>
</template>
<script setup>
import {ref,reactive,computed} from "vue"
 //不考虑给fullname设置值
//此时如果给fullname赋值会报一个警告:Write operation failed: computed value is readonly
const fullName=computed(function(){
   return  firstName.value+'-'+lastName.value
})

//反转字符串
const str=ref("hello");
const reverseStr=computed(()=> str.value.split("").reverse().join(""))
</script>

3.computed和methods对比

与methods实现相比,computed内部有缓存机制(复用),效率更高,调试方便。

<template>
  <div>
  <h3>methods和computed对比</h3>
   <p>使用方法获取当前年龄:{{getAge()}}</p>
   <p>使用方法获取当前年龄:{{getAge()}}</p>
   <p>使用方法获取当前年龄:{{getAge()}}</p>


   <p>使用计算属性获取当前年龄:{{age}}</p>
    <p>使用计算属性获取当前年龄:{{age}}</p>
     <p>使用计算属性获取当前年龄:{{age}}</p>
  </div>
</template>
<script setup>
import {ref,reactive,computed} from "vue"
const bir=ref("2016/5/20");
//使用方法获取当前周岁
const getAge=()=>{
  console.log("methods");
  return new Date().getFullYear()-new Date(bir.value).getFullYear()

}

//使用计算属性获取当前周岁
const age=computed(()=>{
  console.log("computed")
return new Date().getFullYear()-new Date(bir.value).getFullYear();
})
</script>

在这里插入图片描述

计算属性 computed总结:

(1)computed计算属性,是通过计算得出来的属性 是依赖data中的值,如果依赖的值变化,计算属性也会发生变化
(2)computed是有缓存的,只要数据不发生变化,直接从缓存中读取值即可,只有当值发生变化的时候才会重新计算
(3)computed 有get属性还有set属性.大部分情况是读取值,所以设置值很少用到,这时可以简写,只获取get的值即可(只读)

2.相关demo

1.全选和反选

<template>
  <div>
 	<table border="1" cellspacing="0" cellpadding="0">
				<tr>
					<th><input type="checkbox" v-model="isAllChecked" /> 全选</th>
					<th>商品名称</th>
					<th>商品价格</th>
					<th>商品数量</th>
				</tr>
				<tr v-for="item in iceCream" :key="item.id">
					<td><input type="checkbox" v-model="item.ischeck" /> </td>
					<td>{{item.name}}</td>
					<td>{{item.price}}</td>
					<td>{{item.num}}</td>
				</tr>
				<tr>
					<td>总计:</td>
					<td colspan="3">{{total}}</td>
				</tr>
	</table>
  </div>
</template>
<script setup>
import {ref,reactive,computed} from "vue"
//iceCreame的相关操作
const { iceCream } = reactive({
  iceCream: [
    {
      id: 98,
      name: '哈根达斯',
      num: 10,
      price: 98,
      ischeck: false
    },
    {
      id: 56,
      name: '八喜',
      num: 1,
      price: 48,
      ischeck: true
    },
    {
      id: 102,
      name: '冰雪皇后',
      num: 1,
      price: 29,
      ischeck: false
    },
    {
      id: 106,
      name: '蒙牛',
      num: 10,
      price: 4,
      ischeck: true
    }
  ]
})
//实现反选和全选
const isAllChecked=computed({
  get(){
      console.log("触发了get");
      return iceCream.every(el=>el.ischeck);
  },
  set(value){
    console.log("触发了set",value);
    iceCream.forEach(el=>el.ischeck=value);

  }
})
//计算列表选中项的和
const  total=computed(()=>{
  return iceCream.reduce((cur,val)=>{
    if(val.ischeck){
      return cur+val.num*val.price;
    }else{
      return cur;
    }
  },0)

})
    
</script>

2.todos列表

<template>
  <div>
 	<h3>my todos list <span :class="active" v-if="complate!==list.length" >{{list.length-complate}}</span>  </h3>
	<input type="text" class="title"  placeholder="请输入新任务" v-model.trim="txt" @keydown.enter="addItem"   />
        <table class="todos">
				<tr>
					<th>#</th>
					<th>任务列表</th>
					<th>筛选</th>
					<th>状态</th>
					<th>操作</th>
				</tr>
				<tr v-for="(item,index) in filterList" :key="item.id">
					<td>{{index+1}}</td>
					<td>{{item.text}}</td>
					<td><input type="checkbox" v-model="item.done" /> </td>
					<td>{{item.done?"完成":"未完成"}}</td>
					<td> <a href="#" @click="removeItem(item)">删除</a> </td>
				</tr>
			</table>
			<p><input type="checkbox"  v-model="allChecked"   /> 显示全部 </p>
			<p> 已完成 <strong>{{complate}}</strong> /总数 <strong>{{list.length}}</strong> </p>
  </div>
</template>
<script setup>
import {ref,reactive,computed} from "vue"

const  {list}=reactive({
list:[
					{
					  id:1,
					  text:"吃饭",
					  done:true
					},
					{
					  id:2,
					  text:"睡觉",
					  done:false
					},
					{
					  id:3,
					  text:"打豆豆",
					  done:true
					}
				],

})
const  txt=ref("");
 const nextId=ref(4); 
	const allChecked=ref(false);
  //添加一项任务
const addItem=()=>{
			//如果输入框为空,不做任何操作
			if(!txt.value) return;
			var obj={
			     id:nextId.value,
				 text:txt.value,
				 done:false
				}
				list.push(obj);
				txt.value="";
				nextId.value++;
				}
   //删除一项数据:
 const  removeItem=(item)=>{
				//根据当前点击这一项的id,查找在列表中的位置
				const index=list.findIndex(el=>el.id==item.id);
				list.splice(index,1)
			}

   //统计完成的个数
 const	complate=computed(()=>list.filter(el=>el.done).length)	
						
  //根据条件筛选列表
 const	filterList=computed(()=>{
  console.log(allChecked.value)
  return list.filter(el=>!el.done||allChecked.value)
  })
	//计算添加的类名
  const	active = computed(()=>list.length-complate>3?'danger':'waring')
				
		
</script>

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

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

相关文章

CRM系统是什么?它有什么作用?

CRM系统是什么&#xff1f; CRM是Customer Relationship Management&#xff08;客户关系管理&#xff09;的缩写&#xff0c;是一种通过对客户进行跟踪、分析和管理的方法&#xff0c;以增加企业与客户之间的互动和联系&#xff0c;提高企业与客户之间的互信&#xff0c;从而…

GoNote第一章 环境搭建

GoNote第一章 环境搭建 golang介绍 1. 语言介绍 Go 是一个开源的编程语言&#xff0c;它能让构造简单、可靠且高效的软件变得容易。 Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发&#xff0c;后来还加入了Ian Lance Taylor, Russ Cox等人&#xff0c…

oracle远程克隆pdb

使用远程克隆的先决条件是: oracle版本是12.2以上,开启归档模式以及本地undo. 这里是想从172.16.12.250将PRODPDB1克隆到172.16.12.251下&#xff0c;命名为PRODPDB1COPY。 1 确保源端数据库开启归档模式 备注&#xff1a;进cdb里开启归档。 2 在源数据库中&#xff0c;确保…

2023年环境工程与生物技术国际会议(CoEEB 2023)

会议简介 Brief Introduction 2023年环境工程与生物技术国际会议(CoEEB 2023) 会议时间&#xff1a;2023年5月19日-21日 召开地点&#xff1a;瑞典马尔默 大会官网&#xff1a;www.coeeb.org 2023年环境工程与生物技术国际会议(CoEEB 2023)将围绕“环境工程与生物技术”的最新研…

【教程】Unity 与 Simence PLC 联动通讯

开发平台&#xff1a;Unity 2021 依赖DLL&#xff1a;S7.NET 编程语言&#xff1a;CSharp 6.0 以上   一、前言 Unity 涉及应用行业广泛。在工业方向有着一定方向的涉足与深入。除构建数据看板等内容&#xff0c;也会有模拟物理设备进行虚拟孪生的需求需要解决。而 SIMATIC&a…

测评:腾讯云轻量4核8G12M服务器CPU内存带宽流量

腾讯云轻量4核8G12M应用服务器带宽&#xff0c;12M公网带宽下载速度峰值可达1536KB/秒&#xff0c;折合1.5M/s&#xff0c;每月2000GB月流量&#xff0c;折合每天66GB&#xff0c;系统盘为180GB SSD盘&#xff0c;地域节点可选上海、广州或北京&#xff0c;4核8G服务器网来详细…

02-参数传递+统一响应结果

1. 参数传递&#xff1a; -- 简单参数 如果方法形参数名称与请求方法名称不匹配&#xff0c;采用RequestParam注解 -- 实体参数 -- 数组集合参数 -- 日期参数 -- JSON参数 -- 路径参数 2. 统一响应结果 -- 1. 创建Result类&#xff08;放到pojo包中&#xff09; package dem…

centos8 源码安装 apache(内附图片超详细)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

Redis 如何实现库存扣减操作和防止被超卖?

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

《Rank-LIME: Local Model-Agnostic Feature Attribution for Learning to Rank》论文精读

文章目录一、论文信息摘要二、要解决的问题现有工作存在的问题论文给出的方法&#xff08;Rank-LIME&#xff09;介绍贡献三、前置知识LIMEFeature AttributionModel-AgnosticLocalLearning to Rank&#xff08;LTR&#xff09;单文档方法&#xff08;PointWise Approach&#…

工业相机标定(张正友标定法)

目录 相机标定的概念 a. 相机标定的定义 b. 相机标定的目的 相机标定的过程 a. 标定板选择 b. 标定板摆放及拍摄 c. 标定板角点提取 张正友标定法 a. 反解相机矩阵 b.反解畸变系数 使用Python进行相机标定 a. 安装OpenCV b. 准备标定板图片 c. 利用OpenCV进行角点…

HashMap、HashTable、ConcurrentHashMap 之间的区别

哈喽&#xff0c;大家好~我是保护小周ღ&#xff0c;本期为大家带来的是 HashMap、HashTable、ConcurrentHashMap 之间的区别&#xff0c;从数据结构到多线程安全~确定不来看看嘛~更多精彩敬请期待&#xff1a;保护小周ღ *★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* ‘一、…

内存、CPU与指针的知识

在计算机中&#xff0c;内存、CPU和指针是非常重要的概念。在本篇博客中&#xff0c;我们将探讨内存、CPU和指针的知识。 内存的概念 内存是计算机中的一种存储设备&#xff0c;用于存储程序和数据。内存可以被CPU读取和写入&#xff0c;因此是计算机中非常重要的组成部分。在…

006:Mapbox GL添加zoom和旋转控件

第006个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中添加zoom和旋转rotation控件 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共60行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置:h…

【数据结构第八章】- 排序(万字详解排序算法并用 C 语言实现)

目录 一、基本概念和排序方法概述 1.1 - 排序的基本概念 1.2 - 内部排序的分类 二、插入排序 2.1 - 直接插入排序 2.2 - 希尔排序 三、交换排序 3.1 - 冒泡排序 3.2 - 快速排序 3.2.1 - 递归算法 3.2.2 - 优化 3.2.3 - 非递归算法 四、选择排序 4.1 - 简单选择排…

关于统信UOS(Linux)系统磁盘无损扩容的方法

前言 针对某托管平台分配的4台虚拟服务器&#xff0c;操作系统统信UOS&#xff08;Linux&#xff09;&#xff0c;数据磁盘空间已满&#xff0c;无损扩容的办法。 &#xff08;在操作硬盘扩容前&#xff0c;为了安全起见&#xff0c;请通过磁盘快照功能备份服务器系统盘与数据盘…

Java 堆外内存

文章目录Java 堆外内存堆外内存的分配方式使用 Unsafe 类进行分配使用 ByteBuffer 进行分配堆外内存的查看方式Java 堆外内存 在 Java 虚拟机中&#xff0c;分配对象基本上都是在堆上进行的&#xff0c;然而在有些情况下&#xff0c;缓存的数据量非常大时&#xff0c;使用磁盘或…

【Python_Scrapy学习笔记(十四)】基于Scrapy框架的文件管道实现文件抓取(基于Scrapy框架实现多级页面的抓取)

基于Scrapy框架的文件管道实现文件抓取(基于Scrapy框架实现多级页面的抓取) 前言 本文中介绍 如何基于 Scrapy 框架的文件管道实现文件抓取(基于Scrapy框架实现多级页面的抓取)&#xff0c;并以抓取 第一PPT 网站的 PPT 模板为例进行展示&#xff0c;同时抓取此网站数据的方式…

Docker安装Nexus搭建Maven私服及介绍

目录前言一、Nexus是什么&#xff1f;二、Docker安装方式1. 拉取镜像2. 创建挂载目录3. 运行4. 容器运行日志 &#xff08;可选&#xff09;三、用户登录四、仓库介绍五、创建代理仓库六、上传依赖&#xff08;重点&#xff09;七、下载依赖常见问题1、如何把新建的仓库添加到组…

【前端之旅】vue-router声明式导航和编程式导航

一名软件工程专业学生的前端之旅,记录自己对三件套(HTML、CSS、JavaScript)、Jquery、Ajax、Axios、Bootstrap、Node.js、Vue、小程序开发(Uniapp)以及各种UI组件库、前端框架的学习。 【前端之旅】Web基础与开发工具 【前端之旅】手把手教你安装VS Code并附上超实用插件…