解决vue watch数据的方法被调用了两次的问题
程序员文章站
2022-06-22 19:23:13
背景:路由结构/video/1.mp4,即/video是父路由,/1.mp4是/video的动态子路由,在/video父路由中会通过url的params获取视频信息,即通过/1.mp4获取对应的视频完...
背景:
路由结构/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数据的方法被调用了两次的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
上一篇: 工业4.0时代,物联网技术将发挥巨大作用
推荐阅读
-
Mysql5.7中使用group concat函数数据被截断的问题完美解决方法
-
解决Vue axios post请求,后台获取不到数据的问题方法
-
SQLServer乱码问题的分析及解决方法(中文字符被存入数据库后,显示为乱码)
-
vue项目中做编辑功能传递数据时遇到问题的解决方法
-
vue-socket.io接收不到数据问题的解决方法
-
解决vue watch数据的方法被调用了两次的问题
-
解决Vue axios post请求,后台获取不到数据的问题方法
-
SQLServer乱码问题的分析及解决方法(中文字符被存入数据库后,显示为乱码)
-
PHP返回数据被nginx截断问题的解决方法
-
PHP返回数据被nginx截断问题的解决方法