解决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 相关文章推荐
document.designMode的功能与使用方法介绍
Nov 22 Javascript
javascript EXCEL 操作类代码
Jul 30 Javascript
Mootools 1.2教程 Tooltips
Sep 15 Javascript
Javascript 多物体运动的实现
Dec 24 Javascript
JS实现跟随鼠标的链接文字提示框效果
Aug 06 Javascript
深入理解JavaScript中为什么string可以拥有方法
May 24 Javascript
JavaScript Canvas绘制圆形时钟效果
Aug 20 Javascript
js调用刷新界面的几种方式
May 03 Javascript
vue源码解析之事件机制原理
Apr 21 Javascript
解决Vue调用springboot接口403跨域问题
Sep 02 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
Mar 10 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
Jun 12 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学习之 循环结构实现代码
2011/06/09 PHP
thinkphp3.x中cookie方法的用法分析
2016/05/19 PHP
PHP 数组基本操作小结(推荐)
2016/06/13 PHP
PHP实现ASCII码与字符串相互转换的方法
2017/04/29 PHP
IE与firefox之jquery用法区别
2008/10/03 Javascript
网站页面自动跳转实现方法PHP、JSP(上)
2010/08/01 Javascript
简单实用的全选反选按钮例子
2013/10/18 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
详谈$.data()的用法和作用
2017/02/13 Javascript
promise处理多个相互依赖的异步请求(实例讲解)
2017/08/03 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
2017/08/16 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
vue路由组件按需加载的几种方法小结
2018/07/12 Javascript
详解Vue结合后台的列表增删改案例
2018/08/21 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
[01:18]DOTA2超级联赛专访hanci ForLove淘汰感言曝光
2013/06/04 DOTA
[47:06]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第一局
2016/03/05 DOTA
python 中文字符串的处理实现代码
2009/10/25 Python
Python实现自动发送邮件功能
2021/03/02 Python
python re模块findall()函数实例解析
2018/01/19 Python
python如何对实例属性进行类型检查
2018/03/20 Python
python requests 库请求带有文件参数的接口实例
2019/01/03 Python
Python flask框架实现浏览器点击自定义跳转页面
2020/06/04 Python
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
基于html5实现的图片墙效果
2014/10/16 HTML / CSS
小米旗下精品生活电商平台:小米有品
2018/12/18 全球购物
日本最大美瞳直送网:Morecontact(中文)
2019/04/03 全球购物
努力工作保证书
2015/02/28 职场文书
外科护士长工作总结
2015/08/12 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
财务年终工作总结大全
2019/06/20 职场文书
基于Python实现流星雨效果的绘制
2022/03/18 Python
golang三种设计模式之简单工厂、方法工厂和抽象工厂
2022/04/10 Golang
MySQL脏读,幻读和不可重复读
2022/05/11 MySQL