解决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+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
Oct 24 Javascript
Js 获取Gridview选中行的内容操作步骤
Feb 05 Javascript
Js中setTimeout()和setInterval() 何时被调用执行的用法
Apr 12 Javascript
js和css写一个可以自动隐藏的悬浮框
Mar 05 Javascript
详细解读JavaScript的跨浏览器事件处理
Aug 12 Javascript
jqueryMobile使用示例分享
Jan 12 Javascript
jQuery html表格排序插件tablesorter使用方法详解
Feb 10 Javascript
javascript 组合按键事件监听实现代码
Feb 21 Javascript
mac上node.js环境的安装测试
Jul 03 Javascript
基于jQuery Ajax实现下拉框无刷新联动
Dec 06 jQuery
微信、QQ、微博、Safari中使用js唤起App
Jan 24 Javascript
JavaScript实现音乐导航效果
Nov 19 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
20个PHP常用类库小结
2011/09/11 PHP
destoon调用企业会员公司形象图片的实现方法
2014/08/21 PHP
PHP实现远程下载文件到本地
2015/05/17 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
List Information About the Binary Files Used by an Application
2007/06/11 Javascript
javascript 支持ie和firefox杰奇翻页函数
2008/07/22 Javascript
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
Jquery事件的连接使用示例
2013/06/18 Javascript
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
原生js实现addClass,removeClass,hasClass方法
2016/04/27 Javascript
20分钟轻松创建自己的Bootstrap站点
2016/05/12 Javascript
JS笛卡尔积算法与多重数组笛卡尔积实现方法示例
2017/12/01 Javascript
jQuery 实现左右两侧菜单添加、移除功能
2018/01/02 jQuery
Node.JS循环删除非空文件夹及子目录下的所有文件
2018/03/12 Javascript
JavaScript中 ES6变量的结构赋值
2018/07/10 Javascript
分享vue里swiper的一些坑
2018/08/30 Javascript
mpvue将vue项目转换为小程序
2018/09/30 Javascript
解决element ui select下拉框不回显数据问题的解决
2019/02/20 Javascript
vue项目前端知识点整理【收藏】
2019/05/13 Javascript
vue中nextTick用法实例
2019/09/11 Javascript
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
python3.4用函数操作mysql5.7数据库
2017/06/23 Python
python中的迭代和可迭代对象代码示例
2017/12/27 Python
Python将list中的string批量转化成int/float的方法
2018/06/26 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
Python 实现两个服务器之间文件的上传方法
2019/02/13 Python
联想德国官网:Lenovo Germany
2018/07/04 全球购物
以太网Ethernet IEEE802.3
2013/08/05 面试题
新闻学毕业生自荐信
2013/11/15 职场文书
大学生旷课检讨书
2014/01/22 职场文书
文明市民先进事迹
2014/05/15 职场文书
事业单位年度考核个人总结
2015/02/12 职场文书
回复函格式及范文
2015/07/14 职场文书
详解Python+OpenCV绘制灰度直方图
2022/03/22 Python