Vue3的监听属性watch和计算属性computed

监听属性watch
计算属性computed

一、监听属性watch
watch 的第一个参数可以是不同形式的“数据源,watch 可以监听以下几种数据:

一个 ref (包括计算属性)、 一个响应式对象、 一个 getter 函数、
或多个数据源组成的数组

watch 的参数:监视的回调,配置对象(deep:深度监听、immediate:立即执行…)
1、监听单个ref对象

<script setup>import { ref ,reactive, watch } from 'vue';const num = ref(0);//watch参数被监视的数据,监视的回调,配置对象(deep:深度监听、immediate:立即执行.....)const stopWatch = watch(num,(newValue,oldValue)=>{console.log('num新数据:'+newValue,'num旧数据:'+oldValue)})const onNumAdd = ()=>{num.value++;}</script><template><div><div>监听属性watch:{{num}}</div><button @click="onNumAdd()">num+1</button></div>
</template>

在这里插入图片描述
2、监听单个 ref 对象类型 数据
如果我们直接像监听单个ref基础数据类型写,是监听不到数据的,此时我们需要手动加上deep深度监听

<script setup>import { ref ,reactive, watch } from 'vue';const user = ref({name:'zhangsan'});const stopWatch = watch(user,(newValue,oldValue)=>{console.log('user新数据:'+newValue.name,'user旧数据:'+oldValue.name)},{deep:true})const onchangeName = ()=>{user.value.name = 'lisi';}</script><template><div><div>监听属性watch:{{user.name}}</div><button @click="onchangeName()">修改名字</button></div>
</template>

在这里插入图片描述
可以看出若修改的是ref定义的对象中的属性,newValue 和 oldValue 都是对应的新值,因为它们是同一个对象;若修改整个ref定义的对象,newValue 是新值, oldValue 是旧值,因为不是同一个对象了
3、监听 reactive 对象类型数据

<script setup>import { ref ,reactive, watch } from 'vue';const user = reactive({name:'zhangsan',age:20});const stopWatch = watch(user,(newValue,oldValue)=>{console.log('新数据:'+newValue.name,'-----旧数据:'+oldValue.name)})const onchangeName = ()=>{user.name = 'lisi';}const onchangeAge = ()=>{user.age = '22';}</script><template><div><div>监听属性watch----{{user.name}}-----{{user.age}},</div><button @click="onchangeName()">监听名字</button><button @click="onchangeAge()">监听年龄</button></div>
</template>

我们发现不需要像ref对象类型添加deep,因为默认开启深度监听
在这里插入图片描述

4、监听多个数据
监视多个数据,直接把所有数据放到数组中

<script setup>import { ref ,reactive, watch } from 'vue';const num = ref(0);const user = reactive({name:'zhangsan',age:20});const stopWatch = watch([num,()=>user.name,()=>user.age],(newValue,oldValue)=>{console.log('新数据:'+newValue,'-----旧数据:'+oldValue) //newValue[0]对应监听的第一个数据源})const onchange = ()=>{num.value ++;user.name = 'zhangsan修改';user.age = '20';}</script><template><div><div>监听属性watch--{{num}}--{{user.name}}-----{{user.age}},</div><button @click="onchange()">监听多值</button></div>
</template>

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b15e70499a054ec89951575812f274ea.png
5、监听对象的某个属性
监听ref或者reactive定义的对象类型数据中的某个属性时,如果该属性值不是对象类型,需要写成函数的形式,如果是对象类型,可以直接写,也可以写成函数的形式

<script setup>import { ref ,reactive, watch } from 'vue';const user = reactive({name:'zhangsan',age:20});const stopWatch = watch(()=>user.name,(newValue,oldValue)=>{console.log('新数据:'+newValue,'-----旧数据:'+oldValue)})const onchangeName = ()=>{user.name = 'lisi';}const onchangeAge = ()=>{user.age = '22';}</script><template><div><div>监听属性watch----{{user.name}}-----{{user.age}},</div><button @click="onchangeName()">监听名字</button><button @click="onchangeAge()">监听年龄</button></div>
</template>

在这里插入图片描述
6、 watchEffect()
watchEffect也是用来监听数据的,刚进页面就会立即执行一次,同时响应式地追踪其依赖,并在依赖更改时重新执行该函数。
watch要明确指出监听的数据,watchEffect不用明确指定监视的数据,用到哪些属性,就会监听哪些属性。

<script setup>import { ref ,reactive, watch ,watchEffect } from 'vue';const num = ref(0);const user = reactive({name:'zhangsan',age:20});const stopWatch = watchEffect(()=>{console.log('数据发生变化:'+num.value,user.name)})const onchange = ()=>{num.value ++;user.name = 'zhangsan修改';}</script><template><div><div>监听属性watch--{{num}}--{{user.name}}-----{{user.age}},</div><button @click="onchange()">改变</button></div>
</template>

在这里插入图片描述
7、停止监听
有的时候,我们可能只需要监听一次。在监听之后,我们就需要取消对watch的监听。此时我们可以这样做,将watch监听器赋值给一个变量,在取消监听的时候调用此变量即可。
要手动停止一个侦听器,请调用 watch 或 watchEffect 返回的函数:

<script setup>import { ref ,reactive, watch ,watchEffect } from 'vue';const num = ref(0);const stopWatch = watch(num,(newValue,oldValue)=>{console.log('新数据:'+newValue,'旧数据:'+oldValue)//停止监听if(newValue == 5)stopWatch()})const onchange = ()=>{num.value ++;}</script>

在这里插入图片描述

二、计算属性computed
计算属性computed作用是根据已有数据计算出新数据。它需要返回一个值,返回的值就是该计算属性的值。
1、只读取

<script setup>
import { reactive, computed } from 'vue'const author = reactive({name: 'zhangsan',books: ['Vue 2','Vue 3','Vue 4']
})// 一个计算属性 ref
const BooksMessage = computed(() => {return author.books.length > 0 ? 'Yes' : 'No'
})
</script><template><p>计算属性:</p><span>{{ BooksMessage }}</span>
</template>

在这里插入图片描述
2、可写计算属性
计算属性默认是只读的。当你尝试修改一个计算属性时,你会收到一个运行时警告。只在某些特殊场景中你可能才需要用到“可写”的属性,你可以通过同时提供 getter 和 setter 来创建

<script setup>import { ref, computed } from 'vue'const age = ref(16)const newAge = computed({// get函数,获取计算属性的值get(){return age.value + 2},// set函数,当你给计算属性设置值的时候触发set (value) {age.value = value - 2}})
</script><template><p>计算属性:</p><div class="container"><div>今年:{{age}}</div><div>后年:{{newAge}}</div><input type="text" v-model="newAge"></div>
</template>

在这里插入图片描述
总结:
给computed传入函数,返回值就是计算属性的值
给computed传入对象,get获取计算属性的值,set监听计算属性改变。

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

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

相关文章

企业数字化转型

企业数字化更多是业务数字化&#xff0c;是“信息化”的更新升级&#xff0c;和信息化有较大差别。 企业信息化专注于企业信息的记录&#xff0c;“无纸化办公”是其明显特征。企业信息化不改造业务&#xff0c;只是业务的计算机方式实现&#xff0c;不对企业内部流程或组织做…

Linux驱动开发——(四)内核定时器

一、内核的时间管理 1.1 节拍率 Linux内核中有大量的函数需要时间管理&#xff0c;比如周期性的调度程序、延时程序等等&#xff0c;对于驱动编写者来说最常用的是定时器。 硬件定时器提供时钟源&#xff0c;时钟源的频率可以设置&#xff0c;设置好以后就周期性的产生定时中…

C#:用 BigInteger 计算 斐波那契数列

using System.Numerics; 计算 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;不受长整型位数限制。 编写 fibonacci.cs 如下 // C# program for Fibonacci Series // using Dynamic Programming using System; using System.Numerics;class fibona…

【C++语言】字符串String练习题

题目连接&#xff1a; 仅仅反转字母 1.仅仅反转字母 给你一个字符串 s &#xff0c;根据下述规则反转字符串&#xff1a; 所有非英文字母保留在原有位置。所有英文字母&#xff08;小写或大写&#xff09;位置反转。 返回反转后的 s 。 示例 1&#xff1a; 输入&#xff1a;s …

Linux学习(补充部分)

关键字 goto关键字 goto 是一个在编程语言中用于控制流的关键字,它允许程序跳转到代码中的标记处。尽管在一些编程规范中被视为不良实践,但在某些情况下,goto 仍然可以是一种有用的工具。 在 C、C++、Python、以及一些其他编程语言中,goto 的基本语法如下: goto label;…

STM32单片机C语言模块化编程实战:按键控制LED灯并串口打印详解与示例

一、开发环境 硬件&#xff1a;正点原子探索者 V3 STM32F407 开发板 单片机&#xff1a;STM32F407ZGT6 Keil版本&#xff1a;5.32 STM32CubeMX版本&#xff1a;6.9.2 STM32Cube MCU Packges版本&#xff1a;STM32F4 V1.27.1 虽然这里演示的是STM32F407&#xff0c;但是ST…

INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN

联表查询是指在数据库中同时查询多个表&#xff0c;并通过它们之间的关联条件将结果合并在一起。这通常通过 SQL 中的 JOIN 操作来实现。常见的 JOIN 类型包括 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN。 让我们通过一个示例来说明联表查询的基本用法。假设有两个表&a…

ros的master和apollo的cyber的异同

1、前言 ROS (Robot Operating System) 和 Apollo Cyber RT 是两种不同的机器人操作系统框架&#xff0c;各自设计以满足不同场景下尤其是自动驾驶领域的特定需求。虽然它们在设计理念和核心功能上有相似之处&#xff0c;如提供节点&#xff08;Nodes&#xff09;、消息传递机…

书生·浦语大模型第二期实战营第三节-茴香豆:搭建你的 RAG 智能助理 笔记和作业

来源&#xff1a; 视频教程&#xff1a;茴香豆&#xff1a;搭建你的 RAG 智能助理 文字教程&#xff1a;茴香豆&#xff1a;搭建你的 RAG 智能助理 作业来源&#xff1a;第三课作业 茴香豆web链接&#xff1a;茴香豆web-零编程接入飞书微信&#xff08;更新了高精度 LLM&am…

使用R语言生成频数分布表

概要 使用R语言生成频数分布表 在R语言中&#xff0c;可以使用freq()函数来生成频数分布表。首先&#xff0c;将需要分组的数据存储在一个向量中。然后&#xff0c;使用freq()函数将这个向量作为参数输入&#xff0c;即可生成频数分布表。以下是一个示例&#xff1a; 示例 …

代码随想录算法训练营day7 | 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

454.四数相加II 有下面几种思路&#xff1a; 暴力解法&#xff0c;四重循环一个哈希表三重循环两重循环生成一个哈希表两重循环 使用两重循环&#xff1a; class Solution:def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]…

内插和抽取

抽取&#xff1a; 频域表达式的关系&#xff1a; 1、角频率扩大M倍 2、移动2pi、22pi…&#xff08;n-1&#xff09; 2pi 3、相加 4、幅度变为1/M 内插&#xff1a; 加入低通滤波&#xff0c;减小混叠&#xff0c;但是由于截短&#xff0c;也会造成误差&#xff0c;但是…

setTimeout运行机制

当调用 setTimeout 函数时&#xff0c;它用于安排在一定延迟后执行的代码块。它的运行机制如下&#xff1a; 调度任务&#xff1a; 当调用 setTimeout 时&#xff0c;JavaScript 引擎会创建一个定时器&#xff0c;并将指定的代码块&#xff08;回调函数&#xff09;添加到一个称…

贪吃蛇完整代码

贪吃蛇代码 Snake.h //Snake.h #include<windows.h> #include<stdbool.h> #include<stdlib.h> #include<stdio.h> #include<time.h>#define POS_X 24 #define POS_Y 5#define WALL L□ #define BODY L● #define FOOD L★ //类型的声明 // //…

linux复习提纲

后台运行 &&#xff1a;命令行尾输入&#xff0c;命令执行后台运行fg % 作业号&#xff1a;作业前台执行bg % 作业号&#xff1a;作业后台执行 用户权限 主user&#xff08;u&#xff09;-同一组的&#xff08;g&#xff09;-其他&#xff08;o&#xff09; rwx&#xf…

【YOLOv8改进[检测头Head]】YOLOv8的“新头”之动态头(DynamicHead)

目录 一 DynamicHead 二 YOLOv8的“新头”之动态头 1 总体修改 2 配置文件 3 训练 其他 一 DynamicHead 官方论文地址&#xff1a;https://arxiv.org/pdf/2106.08322.pdf 官方代码地址&#xff1a;GitCode - 开发者的代码家园 在计算机视觉应用中&#xff0c;目标检测…

软件著作权登记材料

1、计算机软件著作权登记申请表 2、申请者身份证明 (1)著作权人为企业法人的&#xff1a; 提交有效的企业法人营业执照或事业单位法人证书副本复印件&#xff0c;并需加盖单位公章; (2)著作权人为自然人的&#xff1a; ?提交有效的自然人身份证复印件(正反面复印)。提交《非职…

第四百七十五回

文章目录 1. 概念介绍2. 功能与用法2.1 主要功能2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"四个bublue包对比与总结"相关的内容&#xff0c;本章回中将介绍Get包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中将介…

zustand关于状态变化,是写在内部,还是外部

在使用Zustand时&#xff0c;通常建议将逻辑写在Zustand内部。Zustand是一个状态管理库&#xff0c;它提供了一种简单且强大的方式来管理状态&#xff0c;并且它的设计初衷就是为了让状态管理更加简洁和直观。 在Zustand内部定义状态和操作函数&#xff0c;并通过useStore hoo…

文件、文件夹被占用无法删除

一、针对文件夹无法删除 1、我们打开这个无法删除的文件夹&#xff0c;复制这个文件夹的地址。 2、打开windows任务管理器&#xff0c;选择“性能”选项卡&#xff0c;点击“打开资源监视器”。 3、在“资源监视器”中&#xff0c;cpu中找到“关联的句柄”&#xff0c;在文本框…