Vue3系列——computed、watch

news2024/11/14 15:04:38

目录

Computed

watch

侦听单个数据

侦听多个数据

immediate

deep

精确侦听对象的某个属性


Computed

计算属性computed是依赖于使用它的数据,当数据发生变化时,自定义方法重新调用执行一次计算属性,监测的是依赖值,依赖值不变的情况下其会直接读取缓存进行复用,变化的情况下才会重新计算。

其语法格式如下:

<script setup>
import { computed } from 'vue'
const 变量名 = computed(()=>{		// 定义计算属性
	return 基于响应式数据做计算之后的值
})
</script>

示例代码如下:

<script setup>
import { ref, computed } from 'vue'
const list = ref([1, 2, 3, 4, 5, 6, 7, 8])   // 定义变量
const computedlist = computed(() => {		// 定义计算属性
  return list.value.filter((item) => item > 2)  // 返回数据大于2的参数
})
setTimeout(() => {list.value.push(9, 10)}, 3000)  // 3秒后,list数组增加9、10元素
</script>

<template>
  <div>原始响应式数组-{{ list }}</div>
  <div>计算属性数组-{{ computedlist }}</div>
</template>

在示例代码中,我们定义了list数组和计算属性,计算属性返回值通过变量名为computedlist来接收,通过setTimeout定时器将list数组值改变,当3秒后,list数组增加9、10元素。

注意:

  • 计算属性中不应该有其他操作,例如异步请求、修改dom;

  • 避免直接修改计算属性的值,计算属性应该是只读的;

计算属性可用于性能开销比较大的时候,有效的缓存可以很大程度上减少开销。

watch

当需要在数据变化时执行异步或开销较大的操作时,computed是无法操作异步数据的,所以需要使用watch进行侦听。

侦听器watch作用是侦听一个或多个数据的变化,数据变化时执行的回调函数,两个额外参数:immediate(立即执行)和deep(深度侦听)

侦听单个数据

其语法格式如下:

<script setup>
import { ref , watch} from 'vue'
const 变量名=ref()
watch(侦听的变量名,(newValue,oldValue)=>{
	console.log('count发生了变化,旧值为${oldValue},新值为${newValue}')
})
</script> 

示例代码如下:

<script setup>
import { ref, watch } from 'vue'
const count = ref(0)	 // 定义变量
const setCount = () => {	// 定义方法
  count.value++
}
watch(count, (newVal, oldVal) => {		// 监听
  console.log('变化了', newVal, oldVal)
})
</script>

<template>
  <div>
    <button @click="setCount">+{{ count }}</button>
  </div>
</template>

在示例代码中,当我们点击button按钮,控制台就会输出变化前后的值,如下图所示:

 

侦听多个数据

watch除了侦听单个数据,还可以侦听多个响应式数据变化,不管哪个数据变化都需要执行回调,其语法格式如下:

<script setup>
import { ref , watch} from 'vue'
const 变量名1=ref()
const 变量名2=ref()
// 侦听多个数据源
watch([变量名1,变量名2],([newValue1,newValue2],[oldValue1,oldValue2])=>{
	console.log('变量名1或变量名2发生了变化',[newValue1,newValue2],[oldValue1,oldValue2])
})
</script> 

示例代码如下:

<script setup>
import { ref, watch } from 'vue'
const count = ref(0)	// 定义变量count
const changeCount = () => {count.value++}   // 定义方法changeCount改变变量count值
const name = ref('白巧克力')		// 定义变量name
const changeName = () => {name.value = '白巧克力LIN'}  // 定义方法changeName改变变量name值
watch([count, name], ([newCount, newName], [oldCount, oldName]) => {
  console.log('count或name发生了变化', [newCount, newName], [oldCount, oldName])
})
</script>

<template>
  <div><button @click="changeCount">修改count-{{ count }}</button></div>
  <div><button @click="changeName">修改Name-{{ name }}</button></div>
</template>

在示例中,点击不同的按钮,控制台会输出不同的数据,如下图所示:

 

immediate

在侦听器创建时立即触发回调,响应式数据变化之后继续执行回调,其语法格式如下:

<script setup>
import { ref , watch} from 'vue'
const 变量名=ref()
watch(侦听的变量名,(newValue,oldValue)=>{
	console.log('count发生了变化,旧值为${oldValue},新值为${newValue}')
},{ immediate :true})
</script> 

示例代码如下:

<script setup>
import { ref, watch } from 'vue'
const count = ref(0)	 // 定义变量
const setCount = () => {	// 定义方法
  count.value++
}
watch(count, (newVal, oldVal) => {		// 监听
  console.log('变化了', newVal, oldVal)
},{immediate:true})
</script>

<template>
  <div>
    <button @click="setCount">+{{ count }}</button>
  </div>
</template>

运行结果如下:

 

deep

通过watch监听的ref对象默认是浅层侦听的,直接修改嵌套的对象属性不会触发回调执行,示例代码如下:

<script setup>
import { ref, watch } from 'vue'
const state = ref({ count: 0 })				// 定义变量
watch(state, () => console.log('数据变化了')) // 侦听变量
const change = () => {state.value.count++}	// 修改变量值
change()		// 调用change方法
</script>

运行上面代码,控制台不会有任何反应,这时我们只需要添加deep参数即可,代码如下:

<script setup>
import { ref, watch } from 'vue'
const state = ref({ count: 0 })				// 定义变量
watch(state, () => console.log('数据变化了'),{deep:true}) // 侦听开启深度侦听变量
const change = () => {state.value.count++}	// 修改变量值
change()		// 调用change方法
</script>

这时控制台就会输出数据变化了。

精确侦听对象的某个属性

假如在一个对象中,有很多个属性,但我们只需要侦听一个属性的变化,开启deep深度侦听会损耗性能,那么我们可以精确侦听对象的某个属性,其语法格式如下:

<script setup>
import { ref , watch} from 'vue'
const 变量名=ref()
watch(
	()=>变量名.属性,
	()=>console.log('age发生变化了')
)
</script> 

示例代码如下:

<script setup>
import { ref, watch } from 'vue'
const state = ref({
  name: '白巧克力',
  age: 18
})
const changeName = () => {
  state.value.name = '白巧克力LIN'
}
const changeAge = () => {
  state.value.age = 20
}
watch(
  () => state.value.age,
  () => {
    console.log('age变化了')
  }
)
</script>

<template>
  <div>当前name--{{ state.name }}</div>
  <div>当前age--{{ state.age }}</div>
  <div><button @click="changeName">修改Name-{{ state.name }}</button></div>
  <div><button @click="changeAge">修改Name-{{ state.age }}</button></div>
</template>

在示例代码中,我们点击第一个button按钮,控制台不会输出任何数据,当点击第二个button按钮时,控制台就输出了age变化了。

好了,Vue3系列——计算属性、侦听器就将学到这里了。

公众号:白巧克力LIN

该公众号发布Python、数据库、Linux、Flask、自动化测试、Git、算法、Vue3等相关文章!

- END -

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

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

相关文章

GPT专业应用:生成会议通知

正文共 917 字&#xff0c;阅读大约需要 3 分钟 公务员/文秘必备技巧&#xff0c;您将在3分钟后获得以下超能力&#xff1a; 快速生成会议通知 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图…

Qt6之万能数据类型QVariant详解

QVariant&#xff0c;被称为万能数据类型&#xff0c;实际上它是类似C的联合union类型。简单的说自定义性能强就像一个盒子几乎可以让你放任意的qt类型&#xff0c;同时可以轻松构造任意类型的任意复杂数据结构&#xff0c;但请注意复杂类型意味着性能和效率的让步。 qt6在文档…

好的CRM系统拥有哪些功能

随着客户对企业的重要性越来越高&#xff0c;他们需要一款好用的CRM系统来帮助他们管理客户、销售管道和营销活动。那么国内目前比较好的CRM系统有哪些&#xff1f;下面我们来详细说一下。 国内有很多知名的CRM系统&#xff0c;从本土品牌到国际厂商都有。选择 CRM以高性价比、…

永久免费域名PP.UA最新注册指南

PP.UA是乌克兰个人的域名&#xff0c;支持CF托管&#xff0c;可用于建站或者个人代理用&#xff0c;其永久免费&#xff08;每年续期即可&#xff09;。不过网上关于这个免费域名的申请教程已经全部过期了&#xff0c;多数都是2021年的&#xff0c;本次我来做一个最新的可用教程…

【Redis】Redis 命令之 String

文章目录 ⛄String 介绍⛄命令⛄对应 RedisTemplate API⛄应用场景 ⛄String 介绍 String 类型&#xff0c;也就是字符串类型&#xff0c;是Redis中最简单的存储类型。 其value是字符串&#xff0c;不过根据字符串的格式不同&#xff0c;又可以分为3类&#xff1a; ● string&…

flutter系列之:使用AnimationController来控制动画效果

文章目录 简介构建一个要动画的widget让图像动起来总结 简介 之前我们提到了flutter提供了比较简单好用的AnimatedContainer和SlideTransition来进行一些简单的动画效果&#xff0c;但是要完全实现自定义的复杂的动画效果&#xff0c;还是要使用AnimationController。 今天我…

H桥电机驱动芯片CS9029C可pin对pin兼容DRV8841

CS9029C为打印机和其它电机一体化应用提供一种双通道集成电机驱动方案。CS9029C有两路H桥驱动&#xff0c;最大输出2.5A&#xff0c;可驱动两路刷式直流电机&#xff0c;或者一路双极步进电机&#xff0c;或者螺线管或者其它感性负载。双极步进电机可以以整步、2细分、4细分运行…

未来源码|Dart 3正式发布:100%健全的空值安全、迄今为止最大版本

推荐语&#xff1a; 自从 Flutter Forword 发布了 Dart 3α 预览 之后&#xff0c;大家对 Dart 3 的正式发布就一直翘首以待&#xff0c;这不仅仅是 Dart 版本号追上了 Flutter 版本号&#xff0c;更是 Dart 在 2.0 之后迎来的最大一次更新。Dart 3将只支持健全的Null安全&am…

微信小程序等待wx.requestPayment的回调函数执行完后再执行后续代码

async/await & Promise的再认识 背景 在开发微信小程序过程中&#xff0c;遇到如下需求&#xff1a; 需要等待wx.requestPayment的回调函数执行完后再执行后续代码 这是因为在调用wx.requestPayment之后&#xff0c;会弹出一个支付弹窗&#xff0c;如果此时点击右上角的…

从ChatGPT到大模型

AIGC AIGC1. 关于ChatGPT2. 关于大模型模型即服务。现在大模型的两种&#xff1a;大模型发展趋势&#xff1a;大模型作用&#xff1a;大模型核心&#xff1a; 3. 要复现一个ChatGPT需要的资源支持&#xff1f;4. ChatGPT的局限性5. 类ChatGPT 未来的发展ChatGPT 体现的通用性&…

Java从高德地图获取全国地铁站数据

Java从高德地图获取全国地铁站数据。 数据来源&#xff08;高德地图&#xff09;&#xff1a;http://map.amap.com/subway/index.html?&4401 采集代码 /*** 从高德地图地铁线路同步全国地铁站数据&#xff08;非必要不调用&#xff09;* 数据来源&#xff1a;http://ma…

【电厂用 JL-8D/3X2定时限电流继电器 复合继电器 功耗低 JOSEF约瑟】

JL-8D/3X2定时限电流继电器名称;定时限电流继电器型号:JL-8D/3X2触点容量250V5A功率消耗&#xff1c;5W返回系数0.90.97整定范围0.039.9A;0.130A辅助电源24220VDC/AC 系列型号&#xff1a; JL-8D/3X1定时限电流继电器&#xff1b; JL-8D/3X111A2定时限电流继电器&#xff1b…

深度操作系统 deepin V23 Beta 发布

深度操作系统 deepin V23 发布了首个 Beta 版本。 公告写道&#xff0c;它是 V23 Alpha 版本的一次升级&#xff0c;但不建议用于生产环境。作为一个专注于用户体验的系统&#xff0c;Deepin v23 beta 版本引入了许多新的特性&#xff0c;包括 DDE 新变化、终端、跨版本升级以…

Agilent安捷伦33522B任意波形发生器

Agilent安捷伦33522B任意波形发生器30兆赫 2通道 为您最苛刻的测量生成全方位信号的无与伦比的能力 具有 5 倍低谐波失真的正弦波&#xff0c;可提供更纯净的信号 脉冲频率高达 30 MHz&#xff0c;抖动减少 10 倍&#xff0c;可实现更精确的计时 具有排序功能的逐点任意波形功能…

Notepad++ 添加自定义右键菜单项

目录 1. 背景 020.添加右键菜单项 - “打开至” 030.添加右键菜单项 - “复制到剪切板” 效果图&#xff1a; 1. 背景 笔记本上使用Notepad&#xff0c;会因为存在标签栏&#xff0c;导致窗口能显示的行数减少。 去除标签栏后&#xff0c;又无法操作一些右键菜单。 转而开…

掌握企业核心:工商详细信息API 60多项全维度信息解读

引言 在当今竞争激烈的商业环境中&#xff0c;了解和评估企业的工商注册信息变得至关重要。无论是与供应商合作、寻找合作伙伴&#xff0c;还是进行市场调研和背景调查&#xff0c;我们都需要准确和全面的企业工商信息来做出明智的决策。但是&#xff0c;获取这些信息往往是一…

SpringBoot的常见配置

SpringBoot基础配置 1. 配置文件格式问题导入1.1 修改服务器端口1.2 自动提示功能消失解决方案1.3 SpringBoot配置文件加载顺序 2. yaml问题导入2.1 yaml语法规则2.2 yaml数组数据2.3 yaml数据读取 3. 多环境开发配置问题导入3.1 多环境启动配置3.2 多环境启动命令格式3.3 多环…

CloudCompare二次开发之如何通过PCL进行点云分割?

文章目录 0.引言1.CloudCompare界面设计配准(segment)按钮2.欧式聚类分割&#xff08;Euclidean_Seg&#xff09;3.基于区域生长的分割&#xff08;Region_Seg&#xff09; 0.引言 因笔者课题涉及点云处理&#xff0c;需要通过PCL进行点云数据一系列处理分析&#xff0c;查阅现…

【漏洞预警】泛微E-Cology ofsLogin任意用户登陆漏洞

泛微ofsLogin任意用户登陆漏洞 漏洞描述 泛微e-cology是一套兼具企业信息门户、知识文档管理、工作流程管理、人力资源管理、客户关系管理、项目管理、财务管理、资产管理、供应链管理、数据中心功能的企业大型协同管理平台。 泛微e-cology前台任意用户登录漏洞&#xff1a;…

Git 代码分支管理 | 京东云技术团队

作者&#xff1a;京东科技 周新智 一、引言 近日&#xff0c;IoT 研发团队加入了不少新同学&#xff0c;对 git 分支的命名和管理方式有些许的模糊&#xff0c;分支的命名规范以及管理方式对项目的版本发布至关重要&#xff0c;为了解决实际开发过程中版本发布时代码管理混乱…