解决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 相关文章推荐
JQuery通过AJAX从后台获取信息显示在表格上并支持行选中
Sep 15 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
Jan 28 Javascript
angular和BootStrap3实现购物车功能
Jan 25 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
Jul 27 Javascript
详解.vue文件中监听input输入事件(oninput)
Sep 19 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
Jan 08 Javascript
JavaScript设计模式之代理模式实例分析
Jan 16 Javascript
详解如何使用微信小程序云函数发送短信验证码
Mar 13 Javascript
史上最为详细的javascript继承(推荐)
May 18 Javascript
vue.js实现三级菜单效果
Oct 19 Javascript
JS基础之逻辑结构与循环操作示例
Jan 19 Javascript
微信小程序vant弹窗组件的实现方式
Feb 21 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
域名查询代码公布
2006/10/09 PHP
PHP新手上路(十四)
2006/10/09 PHP
php中json_encode UTF-8中文乱码的更好解决方法
2014/09/28 PHP
php实现的网络相册图片防盗链完美破解方法
2015/07/01 PHP
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
2019/05/29 PHP
Webpack 实现 Node.js 代码热替换
2015/10/22 Javascript
JavaScript reduce和reduceRight详解
2016/10/24 Javascript
js 判断登录界面的账号密码是否为空
2017/02/08 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
2017/07/02 Javascript
VUE 实现滚动监听 导航栏置顶的方法
2018/09/11 Javascript
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
js打开word文档预览操作示例【不是下载】
2019/05/23 Javascript
使用layer.msg 时间设置不起作用的解决方法
2019/09/12 Javascript
如何在面试中手写出javascript节流和防抖函数
2020/10/22 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
[01:40]2014DOTA2国际邀请赛 三冰SOLO赛后采访恶搞
2014/07/09 DOTA
浅谈Python中的bs4基础
2018/10/21 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
python里dict变成list实例方法
2019/06/26 Python
简单了解python数组的基本操作
2019/11/26 Python
pytorch实现MNIST手写体识别
2020/02/14 Python
python encrypt 实现AES加密的实例详解
2020/02/20 Python
python如何使用代码运行助手
2020/07/03 Python
python的scipy.stats模块中正态分布常用函数总结
2021/02/19 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
Html5插件教程之添加浏览器放大镜效果的商品橱窗
2016/01/07 HTML / CSS
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
如何强制垃圾回收
2015/10/06 面试题
恶意软件的定义
2014/11/12 面试题
JSF的标签库有哪些
2012/04/27 面试题
艺术专业大学生自我评价
2013/09/22 职场文书
小学体育教学反思
2014/01/31 职场文书
大队委员竞选稿
2015/11/20 职场文书
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript