Vue实例方法 $watch

Vue的$watch方法允许开发者监视数据变化并执行回调。当数据变动时,回调函数接收newValue和oldValue参数。通过option对象的deep属性可实现深度监视,尤其在处理对象数据时。该方法在监控基本数据和引用类型数据时略有不同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可能会经常遇到这样的问题,怎么监视数据的变化,当数据发生变化的时候,要做一些事情该如何实现,其实不用担心,Vue有一个方法来解决这个问题:

vm.$watch(data,callback,[option]):监视数据的变化,当数据发生变化的时候,执行callback函数,这里的callback函数可以接受两个参数newValue和oldValue作为改变后(前)数据的值,还有option选项,其实就是一个对象{deep:true(false)},用来决定是否深度监视(当监视数据对象的时候用到)。

当然监视的数据可以分为基本数据和引用类型的数据(对象数据),对于两者用法大体上一样,但是还是有些区别:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<title>Vue-$watch</title>
	<style type="text/css" media="screen">
		[v-cloak]{
			display: none;
		}
	</style>
</head>
<body>
	<div id="container" v-cloak>
		<h3>{{user.name}}</h3>
		<h3>{{dog}}</h3>
		<button type="button" @click="alert1">弹出警告框</button>
		<button @click="changeGenerData">改变名字</button>
		<button type="button" @click="changeUserData">改变User</button>
		<input type="text" name="da" v-model = "user.age">
	</div>
	<script type="text/javascript" src="../dist/vue.min.js"></script>
	<script type="text/javascript">
		var app = new Vue({
			el:"#container",
			data:{
				user:{
					name:'张三',
					age:34,
				},
				dog:"金毛"
			},
			methods:{
				alert1:function(){
					alert(1)
				},
				changeGenerData:function(){
					this.dog = "哈士奇"
				},
				changeUserData:function(){
					this.user.age = 45
				}
			},
			watch:{
				//用法一,监视普通的数据
				//方式二,使用Vue实例中的watch选项:
				dog:function(newValue,oldValue){
					alert("dog数据发生了变化!");
					console.log(newValue);
					console.log(oldValue)
				},
				//用法二,监视对象数据
				//方式二,使用Vue实例中的watch选项:
				user:{
					//要做的事情handler选项
					handler:function(newValue,oldValue){
						console.log("数据对象user被改变了!")
					},
					// 是否深度监视
					deep:true
				}
			}
		})
		// vm.$watch(data,callback,[options]),
		// 用法一,监视普通的数据
		//方式一,使用Vue实例的$watch()方法:
		app.$watch("dog",function(newValue,oldValue){
			alert("dog数据发生了变化!");
			console.log(newValue);
			console.log(oldValue)
		})
		//用法二,监视对象数据
		//方式一,使用Vue实例的$watch()方法
		app.$watch("user",function(newValue,oldValue){
			console.log("数据对象user被改变了")
			console.log(newValue.age)//45
			console.log(oldValue.age)//45
			//数据对象user确实发生了改变,而在监视一般数据的时候newValue,oldValue分别代表的是改变后(前)的值
			//那么为什么这里得到的都是改变后的值呢?原因是虽然user发生了改变(属性变了),但是user是一个引用类型的值,newValue,oldValue都保存的是一个指针,指向user的引用,当user发生改变的时候指针的指向没有发生变化,所以此时newvalue和oldVaule的值是一样的
		},{deep:true})
	</script>
</body>
</html>




Vue中,$watch是一个实例方法,用于观察Vue实例中的数据变化。根据引用,如果使用Vue3,可以使用键路径来观察数据的变化。例如,在created钩子函数中使用键路径来观察c.d的变化。当c.d的值发生变化时,回调函数将被触发。 在Vue2中,可以使用命令式的$watch API来观察数据的变化,就像引用中所述。可以使用watch选项或者composition API中的watch来进行多个数据源的同时观察。使用数组来同时侦听多个源,当观察的数据发生变化时,回调函数将被执行。 根据引用中对$watch方法的解释,$watch用于观察Vue实例中的表达式或计算属性函数的变化。回调函数会接收到新值和旧值作为参数。对于简单的键路径,可以直接使用表达式进行观察。对于更复杂的表达式,可以使用一个函数来观察。当表达式或计算属性发生变化时,回调函数将被触发。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [理解vue$watch使用](https://blog.csdn.net/wu_xianqiang/article/details/110265274)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [深入对Vue.js $watch方法的理解](https://download.csdn.net/download/weixin_38606656/13621496)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值