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


Posted in Javascript onNovember 07, 2020

背景:

路由结构/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数据的方法被调用了两次的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Extjs gridpanel 出现横向滚动条问题的解决方法
Jul 04 Javascript
js检测网络是否具体连接功能的代码
May 23 Javascript
js实现跟随鼠标移动且带关闭功能的图片广告实例
Feb 26 Javascript
基于JavaScript短信验证码如何实现
Jan 24 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
Jun 22 Javascript
常用jQuery选择器汇总
Feb 02 Javascript
微信小程序商品到详情的实现
Jun 27 Javascript
js图片轮播插件的封装
Jul 21 Javascript
angularjs请求数据的方法示例
Aug 06 Javascript
vue如何使用async、await实现同步请求
Dec 09 Javascript
js实现动态时钟
Mar 12 Javascript
JavaScript中关于预编译、作用域链和闭包的理解
Mar 31 Javascript
vue 避免变量赋值后双向绑定的操作
Nov 07 #Javascript
浅谈Vue static 静态资源路径 和 style问题
Nov 07 #Javascript
解决VueCil代理本地proxytable无效报错404的问题
Nov 07 #Javascript
Nuxt 项目性能优化调研分析
Nov 07 #Javascript
js实现日历
Nov 07 #Javascript
工作中常用js功能汇总
Nov 07 #Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
Nov 07 #Javascript
You might like
PHP 循环删除无限分类子节点的实现代码
2013/06/21 PHP
解决file_get_contents无法请求https连接的方法
2013/12/17 PHP
Java中final关键字详解
2015/08/10 PHP
学习php设计模式 php实现桥梁模式(bridge)
2015/12/07 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
浅谈php中urlencode与rawurlencode的区别
2016/09/05 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
2016/09/22 PHP
PHP判断密码强度的方法详解
2017/05/26 PHP
javascript十个最常用的自定义函数(中文版)
2009/09/07 Javascript
字符串的replace方法应用浅析
2011/12/06 Javascript
js Object2String方便查看js对象内容
2014/11/24 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
JavaScript实现的伸展收缩型菜单代码
2015/10/14 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
2015/11/23 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
基于javascript实现彩票随机数生成(升级版)
2020/04/17 Javascript
学习JavaScript设计模式之责任链模式
2016/01/18 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
jquery ezUI 双击行记录弹窗查看明细的实现方法
2016/06/01 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
使用jQuery实现动态添加小广告
2017/07/11 jQuery
vue2.0+koa2+mongodb实现注册登录
2018/04/10 Javascript
通过layer实现可输入的模态框的例子
2019/09/27 Javascript
使用Vue 自定义文件选择器组件的实例代码
2020/03/04 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
python连接sql server乱码的解决方法
2013/01/28 Python
TensorFLow 数学运算的示例代码
2020/04/21 Python
简述python&pytorch 随机种子的实现
2020/10/07 Python
python 实现逻辑回归
2020/12/30 Python
总经理职责范文
2013/11/08 职场文书
一份创业计划书范文
2014/02/08 职场文书
技术总监管理职责范本
2014/03/06 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
污染环境建议书
2015/09/14 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书