网络编程
位置:首页>> 网络编程>> JavaScript>> 解决vue watch数据的方法被调用了两次的问题

解决vue watch数据的方法被调用了两次的问题

作者:巴中第一皇子  发布时间:2024-05-05 09:10:33 

标签:vue,watch数据,调用

背景:

路由结构/video/1.mp4,即/video是父路由,/1.mp4是/video的动态子路由,在/video父路由中会通过url的params获取视频信息,即通过/1.mp4获取对应的视频完整信息,然后通过props传到动态子路由中,然后子路由通过接受到的视频对象,进行展示

问题:

当路由切换时,即当我点击其他视频时,导致动态子路由变化时,我监听了/video父路由的变化并重新根据url的params获取视频对象,并自动通过props传入子路由中,我在子路由中通过watch 视频对象来进行一些操作,结果


watch: {
video () {
console.log("test")
}
}

test被打印了两次,通过一番查找,才发现,当子路由切换时,父路由/video中的data数据都会被初始化为默认值,所以导致video对象变化了两次,一次是因为初始化被重置为默认值空对象,一次是请求后的正确数据

结局:

将video对象存到vuex中,然后父路由将vuex中的video对象传给子路由就行了

补充知识:vue watch一个对象或数组时,newvalue和oldvalue一样

在官方的代码改写了一下,当深度watch一个对象时,newval和oldval的值为什么是相等的呢?


var vm = new Vue({
data: {
a: 1,
 c:{
  c1:1,
  c2:2
 }
},
watch: {
'a': function (val, oldVal) {
 console.log(val, oldVal,(val== oldVal))
},
// 方法名
'b': 'someMethod',
// 深度 watcher
'c': {
 handler: function (val, oldVal) {
  console.log(val, oldVal,(val== oldVal))
  },
 deep: true
}
}
})

vm.a = 2
vm.c.c1 = 2

和深度无关,而是在修改(不是替换)对象或数组时,旧值将与新值相同,因为它们索引同一个对象/数组。Vue 不会保留修改之前值的副本。

来源:https://blog.csdn.net/weixin_38312502/article/details/105199577

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com