Vue中关于Props中的Date类型的属性的监听

问题描述

Vue中当子组件使用watch监听父组件的Date类型的属性的值的变化的时候,会出现修改了父组件中与Date类型属性不相干的属性的值的时候仍旧触发了Date类型的属性的监听事件,如下面的示例会发现当调用了父组件的changeOther方法修改了order的值的时候,子模块的watch中的date监听执行了,即使是date的值未发生改变。


父模块:

<template>
	<div>
		....
		<child :date="new Date(date)"></child>
	<div>
</template>

import child from ./Child.vue

export default{
	components:{
		child
	},
	data(){
		return{
			other:[],
			date:'2023-11-29',
		}
	},
	method:{
		changeOther(){
			this.other=[]
		}
	}
	
}

子模块:

<template>
	<div>
		...
	<div>
</template>


export default{
	props:{
		date:{
			type:Date,
		}
	},
	watch:{
		date(){
			console.log('触发了date修改事件')
		}
	}
	
}

原因分析:

在 Vue 中,当父模块更新一个数组变量的值时,会触发子组件的重新渲染。这是因为子组件依赖于父组件传递的数组数据。当数组数据发生变化时,Vue 会自动检测到这一变化并更新子组件的视图。

因为子组件在处理数组数据变化的同时,也对 date 变量进行了监听。当数组数据发生变化时,子组件的 watch 方法会被触发,从而执行相应的逻辑。

这里的父组件中传值的时候使用了<child :date="new Date(date)"></child>,其中new Date导致了传给子组件的date的值看着是一样的,但是其实又不是一样的。

根本原因还是JavaScript中的Date类型不能直接比较不同。如果需要比较两个日期,需要先将它们转换为相同的时间戳(毫秒数),然后再进行比较


解决方案:

修改子组件

<template>
	<div>
		...
	<div>
</template>


export default{
	props:{
		date:{
			type:Date,
		}
	},
	watch:{
		date:{
            handler(newTime,oldTime){
				if(newTime==undefined) return;
				if(oldTime == undefined){
					console.log('触发了date修改事件');
					return;
				}
					
				const newSpan = newTime.getTime();
				const oldSpan = oldTime.getTime();
				if(newSpan !== oldSpan){
					console.log('触发了date修改事件');
				}
			},
			deep:true,
			immediate:true
        }
	}
	
}
  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值