解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题


Posted in Javascript onJuly 28, 2020

bus总线是vue中路由跳转传递数据的常用方法,适用于传递数据不多的情况,但是在使用的过程中发现,bus总线在第一次路由跳转的时候总是不能够成功传递需要传递的数据。检查bus的配置以及调用方法,均没有出错,错就错在没有理解Vue的生命周期!!!

我们知道bus的$on的监听应该位于$emit之前,如果在emit之前没有创建监听事件,那么肯定是得不到需要的数据。因此,我通过两个页面来了解路由跳转时两个页面的生命周期,下面给出其中一个页面的部分代码:

//页面1
 beforeCreate () {
  console.group('%c%s', 'color:red', 'beforeCreate 创建前状态===============组件1》')
 },
 created () {
  console.group('%c%s', 'color:red', 'created 创建完毕状态===============组件1》')
 },
 beforeMount () {
  console.group('%c%s', 'color:red', 'beforeMount 挂载前状态===============组件1》')
 },
 mounted () {
  console.group('%c%s', 'color:red', 'mounted 挂载状态===============组件1》')
 },
 beforeUpdate () {
  console.group('%c%s', 'color:red', 'beforeUpdate 更新前状态===============组件1》')
 },
 updated () {
  console.group('%c%s', 'color:red', 'updated 更新状态===============组件1》')
 },
 beforeDestroy () {
  console.group('%c%s', 'color:red', 'beforeDestroy 破前状态===============组件1》')
 },
 destroyed () {
  console.group('%c%s', 'color:red', 'destroyed 破坏状态===============组件1》')
 }

当从页面1跳转到页面2的时候,控制台的打印情况如下:

解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题

从上图便可以发现,bus第一次使用无法传递的原因:

在页面1通过$emit方法传递数据然后跳转路由的时候,其实页面2的$on监听还没有建立,因此无法得到数据!

基于上述原因,提出的解决办法如下:

在页面1的beforeDestroy或者destroyed钩子函数中emit数据,在页面2的beforeCreate、created或者beforeMount钩子函数中建立$on监听事件,然后在页面2的mounted钩子函数中$on得到的数据赋值给页面2的变量中。

//页面1
 beforeDestroy () {
  bus.$emit('dataFromBus1',this.dataFromBus1);
 },
 //页面2
  beforeCreate () {
  bus.$on('dataFromBus1',function(url){
   bus.dataFromBus1 = url
  });  
 }, 
 mounted () {
  this.dataFromBus1 = bus.dataFromBus1;  
 },

解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题

可以发现,第一次跳转的时候页面2就能够得到传递的数据!!!

这个坑应该是使用bus必须会 踩到的,希望下次使用的时候能够留个心眼!!!

补充知识:vue非父子组件传值(bus)遇到的坑

解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题

解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题

控制台可以打印出传递过来的值,但就是不会渲染到页面上那么重点来了!!!

解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题

在A销毁之前,B组件的beforeCreate ,created,和beforeMount这三个钩子函数先触发,之后才是A组件的销毁钩子的触发,因为总线Bus要求要先有监听在触发,才能成功监听,所以我们只能在A组件的beforeDestroy或者destroyed这两个生命周期钩子中触发函数emit,同理也只能在B组中的beforeCreate,created,和beforeMount这三个钩子函数中监听 emit,同理也只能在B组中的beforeCreate ,created,和beforeMount这三个钩子函数中监听emit,同理也只能在B组中的beforeCreate,created,和beforeMount这三个钩子函数中监听on。

解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题

解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题

页面渲染的值如下图所示

解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题

还是有之前重复触发的问题,还是会随着切换次数的增加而使监听函数触发的次数增加,解决这个问题就简单了。在我们用总线传值的时候要记得关闭监听,在B组件中的destroyed钩子中增加EventBus.$off方法即可,至此就没问题了。

以上这篇解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
理解Javascript_07_理解instanceof实现原理
Oct 15 Javascript
GreyBox技术总结(转)
Nov 23 Javascript
Node.js中的事件驱动编程详解
Aug 16 Javascript
jQuery中width()方法用法实例
Dec 24 Javascript
script标签属性用type还是language
Jan 21 Javascript
多种jQuery绑定事件的实现方式
Jun 13 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
Aug 20 Javascript
详解React+Koa实现服务端渲染(SSR)
May 23 Javascript
解决vue接口数据赋值给data没有反应的问题
Aug 27 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
Oct 25 Javascript
小程序页面动态配置实现方法
Feb 05 Javascript
微信小程序常用赋值方法小结
Apr 30 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
Jul 28 #Javascript
vue+element-ui JYAdmin后台管理系统模板解析
Jul 28 #Javascript
vue实现虚拟列表功能的代码
Jul 28 #Javascript
vue.js 解决v-model让select默认选中不生效的问题
Jul 28 #Javascript
Vue2.0 $set()的正确使用详解
Jul 28 #Javascript
JavaScript 监听组合按键思路及代码实现
Jul 28 #Javascript
JavaScript动画实例之粒子文本的实现方法详解
Jul 28 #Javascript
You might like
深入了解PHP类Class的概念
2012/06/14 PHP
探讨PHP中this,self,parent的区别详解
2013/06/08 PHP
linux实现php定时执行cron任务详解
2013/12/24 PHP
PHP使用GIFEncoder类生成gif动态滚动字幕
2014/07/01 PHP
php检测url是否存在的方法
2015/04/14 PHP
PHP SPL标准库之接口(Interface)详解
2015/05/11 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
phpStudy vscode 搭建debug调试的教程详解
2020/07/28 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
取得父标签
2006/11/14 Javascript
JS清除选择内容的方法
2015/01/29 Javascript
jQuery实现自动滚动到页面顶端的方法
2015/05/22 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
2016/03/07 Javascript
javascript实现获取指定精度的上传文件的大小简单实例
2016/10/25 Javascript
jquery实现图片轮播器
2017/05/23 jQuery
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
js图片放大镜实例讲解(必看篇)
2017/07/17 Javascript
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
vue实现简单加法计算器
2020/10/22 Javascript
vue+Element-ui实现分页效果
2020/11/15 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
[02:05]2014DOTA2西雅图国际邀请赛 BBC第二天小组赛总结
2014/07/11 DOTA
Python控制多进程与多线程并发数总结
2016/10/26 Python
Python实现的knn算法示例
2018/06/14 Python
使用Python的turtle模块画国旗
2019/09/24 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
2019/12/18 Python
python 串行执行和并行执行实例
2020/04/30 Python
opencv 阈值分割的具体使用
2020/07/08 Python
Python requests接口测试实现代码
2020/09/08 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
htnl5利用svg页面高斯模糊的方法
2018/07/20 HTML / CSS
戴尔英国翻新电脑和电子产品:Dell UK Refurbished Computers
2019/07/30 全球购物
建筑设计师岗位职责
2013/11/18 职场文书
夫妻忠诚协议范文
2014/11/16 职场文书
同学聚会感言一句话
2015/07/30 职场文书
关于分班的感言
2015/08/04 职场文书