解决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 不会保留修改之前值的副本。
以上这篇解决vue watch数据的方法被调用了两次的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
详解如何在Vue3使用<script lang=“ts“ setup>语法糖
本文主要介绍了在Vue3使用<script lang=“ts“ setup>语法糖,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2022-06-06
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
这篇文章主要介绍了vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-11-11


最新评论