解决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 相关文章推荐
JavaScript 监听textarea中按键事件
Oct 08 Javascript
浅谈JavaScript编程语言的编码规范
Oct 21 Javascript
JS实现网页Div层Clone拖拽效果
Sep 26 Javascript
极力推荐10个短小实用的JavaScript代码段
Aug 03 Javascript
javascript表达式和运算符详解
Feb 07 Javascript
ES5学习教程之Array对象
Apr 01 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
Oct 20 Javascript
webpack源码之loader机制详解
Apr 06 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
May 30 Javascript
JS中实现浅拷贝和深拷贝的代码详解
Jun 05 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
Jun 16 Javascript
原生微信小程序开发中 redux 的使用详解
Feb 18 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
解析php时间戳与日期的转换
2013/06/06 PHP
php中fgetcsv()函数用法实例
2014/11/28 PHP
php正则替换处理HTML页面的方法
2015/06/17 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
PHP异常类及异常处理操作实例详解
2018/12/19 PHP
Yii框架的路由配置方法分析
2019/09/09 PHP
Dom在ajax技术中的作用说明
2010/10/25 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
jquery获取url参数及url加参数的方法
2015/10/26 Javascript
JS模拟按钮点击功能的方法
2015/12/22 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
jquery层级选择器的实现(匹配后代元素div)
2016/09/05 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
2018/01/25 jQuery
JSONP原理及应用实例详解
2018/09/13 Javascript
vue导航栏部分的动态渲染实例
2019/11/01 Javascript
vant自定义二级菜单操作
2020/11/02 Javascript
Python max内置函数详细介绍
2016/11/17 Python
python使用turtle绘制分形树
2018/06/22 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
Python tkinter三种布局实例详解
2020/01/06 Python
pytorch模型存储的2种实现方法
2020/02/14 Python
Anaconda+Pycharm环境下的PyTorch配置方法
2020/03/13 Python
Pycharm安装并配置jupyter notebook的实现
2020/05/18 Python
python框架flask入门之环境搭建及开启调试
2020/06/07 Python
python tkinter实现连连看游戏
2020/11/16 Python
PHP面试题附答案
2015/11/28 面试题
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
2012/11/09 面试题
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
公司踏青活动方案
2014/08/16 职场文书
万能检讨书
2015/01/27 职场文书
主婚人致辞精选
2015/07/28 职场文书
Python 如何解决稀疏矩阵运算
2021/05/26 Python