vue3选项式api监控数组变化

本文探讨了Vue3中数组监控的挑战,尤其是对复杂类型数据如对象和数组的元素变更不被普通watch监听。解决方案包括使用Vue2的this.$set()方法和Vue3的深度监听选项式API。结论指出,Vue3通过深度监控实现对数组和对象内容元素的响应。

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

目录

1、vue3数组监控的问题

2、解决方案

        2.1 vue2的解决方案

        2.2 vue版本升级所带来的问题

        2.3 选项式api深度监控的写法

3、结论


1、vue3数组监控的问题

        vue3中使用监控器 watch 能够完成一些基本类型数据的监控,但是如果碰到复杂类型的数据,除了直接给变量的赋值操作,元素的添加和改变(包括长度变化)普通watch是监控不到的。这里的复杂类型包括对象和数组。

使用 vue3给出一个示例程序:

<template>
	<div>
		<div><button @click="change">按钮1</button></div>
        <div><button @click="change2">按钮2</button></div>
	</div>
</template>

<script>
	export default{
		data() {
			return {
				msg1: 1,
				msg2: "test",
				msg3: ["Tom","Jerry","Spiker"],
				msg4: {a: "你好"}
			}
		},
		methods: {
			change(){
				this.msg1 += 1
				this.msg2 += 1
				this.msg3.push("Rose")
				this.msg4.b = "你也好"
			},
            change2(){
				this.msg3 = ["Tom and Jerry"]
				this.msg4 = {a: "你也好!"}
			}
		},
		watch: {
			msg1 (newValue, oldValue) {
				console.log("msg1 change")
			},
			msg2 (newValue, oldValue) {
				console.log("msg2 change")
			},
			msg3 (newValue, oldValue) {
				console.log("msg3 change")
			},
			msg4 (newValue, oldValue) {
				console.log("msg4 change")
			}
		}
	}
</script>

<style>
</style>

点击按钮1,程序的打印结果为: 

 说明 msg3和 msg4变量的元素添加确实没有监听到。

点击按钮2,程序打印结果为:

说明数组和对象的直接赋值操作是可以被 watch 监听到的。

 那么为什么普通 watch 没有提供对数组和对象的元素变化的监听呢? 问题原文。简而言之就是将基本类型的数据和复杂类型的数据做了区分,以避免复杂数据对于性能的损耗(个人理解)。

2、解决方案

        2.1 vue版本

        网上有些文章给出的解决办法是通过 this.$set() 来指定数组下标元素的变化,那么这样就可以直接使用 watch 来进行监听。但是没有写清楚,这是vue2的解决办法(也可能那些博主在写那些文章时vue3还没有发布)。

        总之,vue3响应式数据的实现方法是和vue2不同的。比如上面的代码,如果是vue2的话,是可以实现 arr.push() 方法的监控,但是下标元素的改变,比如 arr[ index] = item 是实现不了的,所以需要监控的数组变量使用 this.$set() 来改变下标元素才能被 watch 监控到。

        这篇文章只给出功能描述和写法,想弄清楚这种差别原因的需要去研究 vue2和vue3响应式实现原理的不同。喜欢的同学可以去研究一下源码。

        2.2 vue3选项式api深度监控的写法

        vue3的数据响应是基于代理 proxy,所以取消了  this.$set()的使用,但是引入深度监控的写法。所以 vue3可以通过 watch的深度监控来实现数组和对象变化的响应。

        这里修改一下上面的代码,将 msg3和 msg4的监控器改成:

msg3: {
	deep: true,
	handler(newValue, oldValue) {
		console.log("msg3 change")
	}
},
msg4 : {
	deep: true,
	handler(newValue, oldValue) {
		console.log("msg4 change")
    }
}

 重新点击一下按钮1 ,打印结果变成:

 实现了对于数组和对象的内容元素监控。

3、结论

        vue3要实现数组监控的话,可以使用深度监控来实现。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

loggers_kid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值