Vue:侦听属性

Vue:侦听属性

    • watch
    • 深度侦听
    • 异步任务


watch

Vue中,允许用户在数据改变时,做出一定的处理。

语法:

new Vue({
	watch:{
		属性名:{
			handler(newValue, oldValue){
				// 函数体
			}		
		}
	}
})

当一个属性被写入watch中,每当这个属性值修改,就会调用对应的handler方法,该方法的第一个参数为旧值,第二个参数为新值。

示例:

<div id="root">
	<button @click="num++">num加一</button>
</div>

<script type="text/javascript">
	const vm = new Vue({
		el:'#root',
		data:{
			num: 0
		},
		watch:{
			num:{
				handler(newValue,oldValue){
					console.log(oldValue, " -> ", newValue)
				}
			}
		}
	})
</script>

以上代码中,设置了一个按钮,每次点击按钮num++。在Vue实例中侦听num属性,当num的值发生改变,就会调用handler方法。

输出结果:

在这里插入图片描述

如果加上immediate: true属性,那么当整个Vue初始化时,也会调用一次侦听属性的方法:

const vm = new Vue({
	el:'#root',
	data:{
		num: 0
	},
	watch:{
		num:{
		    immediate: true,
			handler(newValue,oldValue){
				console.log(oldValue, " -> ", newValue)
			}
		}
	}
})

输出结果:

在这里插入图片描述

这次多了一个undefined -> 0的过程,也就是第一次初始化data.num的过程,也触发了侦听属性。

如果侦听属性中不带有任何其他属性,只有一个handler,可以简写:

new Vue({
	watch:{
		num(newValue,oldValue){
			console.log(oldValue, " -> ", newValue)
		}
	}
})

也就是直接把被侦听的属性num写为一个函数,而不是一个对象。


深度侦听

当被侦听的属性是一个对象时,修改对象的属性不会触发侦听属性,只有整个对象都被替换,才会触发侦听属性。

<div id="root">
	<h3>a的值是:{{nums.a}}</h3>
	<button @click="nums.a++">a+1</button>
	<button @click="nums = {a:666,b:888}">彻底替换掉nums</button>
</div>

<script type="text/javascript">
	const vm = new Vue({
		el:'#root',
		data:{
			nums:{
				a:1,
				b:100
			}
		},
		watch:{
			nums:{
				handler(){
					console.log('nums changed')
				}
			}
		}
	})
</script>

以上代码中,对对象nums进行侦听,如果属性修改触发回调函数。在nums中包含a b两个属性。在两个按钮中,一个让a++,另一个直接替换掉整个nums

输出结果:

在这里插入图片描述

a的值一直添加到10,都没有触发侦听属性的回调函数。

在这里插入图片描述

替换掉整个nums,才会触发回调,输出nums changed

如果希望当任意一个属性值被修改时,都能触发对象的回调,可以添加deep: true属性:

nums:{
	deep:true,
	handler(){
		console.log('nums changed')
	}
}

这样不论对象内部有多少层嵌套,都会触发对象的侦听属性。


异步任务

绝大部分情况下,watch的任务,computed都可以完成,但是watch的功能其实比computed更加强大,比如computed无法处理异步任务。

示例:

<div id="root">
	姓:<input type="text" v-model="firstName"> <br/><br/>
	名:<input type="text" v-model="lastName"> <br/><br/>
	全名:<span>{{fullName}}</span> <br/><br/>
</div>

<script type="text/javascript">
	const vm = new Vue({
		el:'#root',
		data:{
			firstName:'张',
			lastName:'三'
		},
		computed: {
			fullName(){
				return this.firstName + '-' + this.lastName
			}
		}
	})
</script>

以上代码,是一个通过姓和名得到姓名的过程,fullName通过计算属性实现。

假设要求fullName在姓或名修改后一秒,再输出新名称,这就需要使用setTimeout创建一个异步任务:

computed: {
	fullName(){
		let name
		setTimeout(()=>{
			name = this.firstName + '-' + this.lastName
		},1000);
		return name
	}
}

输出:

在这里插入图片描述

结果fullName直接不输出了,因为fullName依赖于函数返回值,但是函数返回值是name,这个变量一开始是let name,随后进入异步任务setTimeout中拿到name = this.firstName + '-' + this.lastName,不过当异步任务还没有返回,就直接return name了,这导致name = undefinedVue直接不输出。

watch就可以处理异步任务:

new Vue({
	el:'#root',
	data:{
		firstName:'张',
		lastName:'三',
		fullName:'张-三'
	},
	watch:{
		firstName(val){
			setTimeout(()=>{
				this.fullName = val + '-' + this.lastName
			},1000);
		},
		lastName(val){
			setTimeout(()=>{
				this.fullName = val + '-' + this.lastName
			},1000);
		}
	}
})

firstNamelastName进行侦听,在侦听的函数内部,执行异步任务setTimeout,修改fullName。由于fullName是一个存在于data内部的变量,当一秒后异步任务执行完毕,就会修改data内的值,导致模板重新渲染,实现一秒后更新fullName的值。


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

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

相关文章

SDL事件相关

文章目录 事件相关的函数和数据结构用户自定义事件代码相关&#xff1a; 事件相关的函数和数据结构 SDL_WaitEvent :等待一个事件SDL_PushEvent 发送一个事件SDL_PumpEvents(): 将硬件设备产生的时间放入事件队列 &#xff0c;用于读取事件&#xff0c;在调用该函数之前&#…

UWB技术在智能资产管理中的应用

超宽带&#xff08;UWB&#xff09;技术是一种高精度、低功耗的定位技术&#xff0c;在现代智能管理系统中得到了广泛的应用。凭借高效的数据传输和精确的定位能力&#xff0c;UWB在资产管理、仓储物流、人员定位等领域展现了巨大的潜力。通过与固定资产管理系统和人员定位系统…

SQL 注入(文件读取)

使用 Grafana&#xff08;一种开源数据可视化和监控解决方案&#xff0c;可推动明智的决策、提高系统性能并简化故障排除&#xff09;通过漂亮的仪表板轻松收集、关联和可视化数据。Grafana 实验性 SQL 表达式功能中的一个 DuckDB SQL 注入漏洞。任何经过身份验证的用户都可以通…

初探鸿蒙:从概念到实践

一、鸿蒙开发的环境准备 开发工具&#xff1a;使用 DevEco Studio&#xff0c;支持 ArkTS 语法。 系统要求&#xff1a;确保计算机符合 DevEco Studio 的最低系统需求。安装步骤&#xff1a;下载 DevEco Studio&#xff0c;安装合适的 SDK 和模拟器 二、鸿蒙应用可以…

《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析

本文是将文章《XGBoost算法的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 我们定义一颗树的复杂度 Ω Ω Ω&#xff0c;它由两部分组成&#xff1a; 叶子结点的数量&#xff1b;叶子结点权重向量的 L 2 L2 L2范数&#xff1b; 公式(…

MySQL数据库基础(一) MySQL安装及数据类型

目录 一、MySQL数据裤简介 二、MySQL数据的安装 2.1、MySQL安装 2.2、修改MySQL密码登录策略 三、数据库基础管理 3.1、连接方式及数据储存流程 3.2、库管理命令 3.3、表管理命令 3.4、记录管理命令 四、MySQL数据类型 4.1、常见信息种类 4.2、字符型 4.3、数值型 4.4、日期时间…

《现代工业经济和信息化》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答&#xff1a; 问&#xff1a;《现代工业经济和信息化》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《现代工业经济和信息化》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;山西省工业和…

SpringCloudAlibabaSidecar整合异构微服务

Spring Cloud Alibaba Sidecar概述 这里引用官方文档的原话&#xff1a; spring-cloud-starter-alibaba-sidecar 是一个用来快速完美整合&#xff08;享受服务发现的优势、有负载均衡、有断路器&#xff09; Spring Cloud 与异构微服务&#xff08;非Spring Cloud应用&#xf…

Vue 组件传递数据-Props(六)

一、Props传递静态数据 defineProps() 和 defineEmits() 为了在声明 props 和 emits 选项时获得完整的类型推导支持&#xff0c;我们可以使用 defineProps 和 defineEmits API&#xff0c;它们将自动地在 <script setup> 中可用&#xff1a; defineProps 和 defineEmits …

SpringBoot源码解析(三)

一、手写模拟springboot核心流程 前面两章内容已经详细解释了springboot的核心原理与启动流程&#xff0c;本章通过手写模拟实现一个SpringBoot&#xff0c;让大家能以非常简单的方式就能知道SpringBoot大概是如何工作的&#xff0c;作为对上两章内容的一个巩固。 一、模拟Sp…

Python实战:调用淘宝API以抓取商品页面数据

在数据驱动的商业决策中&#xff0c;获取电商平台的商品数据至关重要。淘宝作为中国最大的在线购物平台&#xff0c;其商品数据对于市场分析、价格监控和竞品研究等方面都具有极高的价值。本文将通过一个Python实战案例&#xff0c;展示如何调用淘宝API来抓取商品页面的数据。 …

STL---迭代器

本文来源&#xff1a;《C语言程序设计》第10章 理解迭代器对于理解STL框架并掌握STL的使用至关重要。 迭代器是泛化的指针&#xff0c;STL算法利用迭代器对存储在容器中的元素序列进行遍历&#xff0c;迭代器提供了访问容器中每个元素的方法。 虽然指针也是一种迭代器&#…

设计模式-七个基本原则之一-单一职责原则 + SpringBoot案例

单一职责原理:(SRP) 面向对象七个基本原则之一 清晰的职责&#xff1a;每个类应该有一个明确的职责&#xff0c;避免将多个责任混合在一起。降低耦合&#xff1a;通过将不同的职责分开&#xff0c;可以降低类之间的耦合度&#xff0c;提高系统的灵活性。易于维护&#xff1a;当…

京东AI单旋旋转验证码98准确率通杀方案

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 本文滑块识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/other/12 京东单旋验证码最近更新了,使用AI生成,要求识别角度,以下是部分数据集: 接下…

playground.tensorflow神经网络可视化工具

playground.tensorflow 是一个可视化工具&#xff0c;用于帮助用户理解深度学习和神经网络的基本原理。它通过交互式界面使用户能够构建、训练和可视化简单的神经网络模型。以下是一些主要的数学模型和公式原理&#xff0c;它们在这个平台中被应用&#xff1a; 1. 线性模型 线…

[vulnhub] DarkHole: 2

https://www.vulnhub.com/entry/darkhole-2,740/ 端口扫描主机发现 探测存活主机&#xff0c;185是靶机 # nmap -sP 192.168.75.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-08 18:02 CST Nmap scan report for 192.168.75.1 Host is up (0.…

【开源免费】基于SpringBoot+Vue.JS宠物咖啡馆平台(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 064 &#xff0c;文末自助获取源码 \color{red}{T064&#xff0c;文末自助获取源码} T064&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

移动取证和 Android 安全

当今的数字时代已经产生了许多技术进步&#xff0c;无论是智能手机还是虚拟现实、人工智能和物联网 (IoT) 等下一代基础技术。 智能手机已不再只是奢侈品&#xff0c;而是我们生存所必需的东西。根据各种统计数据&#xff0c;如今全球有超过 50% 的人使用手机。 由于数据存储…

C++builder中的人工智能(14):修正线性单元(ReLU)激活函数

这篇文章将解释在人工神经网络&#xff08;ANN&#xff09;中修正线性函数&#xff08; Rectified Linear Function&#xff09;是什么&#xff0c;以及如何使用ReLU激活函数。让我们回顾一下激活函数的概念&#xff0c;并定义这些术语。学习修正线性函数对于使用C软件编写程序…

【信号处理】基于联合图像表示的深度学习卷积神经网络

Combined Signal Representations for Modulation Classification Using Deep Learning: Ambiguity Function, Constellation Diagram, and Eye Diagram 信号表示 Ambiguity Function(AF) 模糊函数描述了信号的两个维度(dimensions):延迟(delay)和多普勒(Doppler)。 …