解决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 相关文章推荐
ajax不执行success回调而是执行了error回调
Dec 10 Javascript
jquery无法设置checkbox选中即没有变成选中状态
Mar 27 Javascript
JQuery获取表格数据示例代码
May 26 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
May 28 Javascript
jQuery实现form表单元素序列化为json对象的方法
Dec 09 Javascript
基于JS代码实现实时显示系统时间
Jun 16 Javascript
jQuery的$.extend 浅拷贝与深拷贝
Mar 08 Javascript
vue-router2.0 组件之间传参及获取动态参数的方法
Nov 10 Javascript
在JS循环中使用async/await的方法
Oct 12 Javascript
vue实现pdf文档在线预览功能
Nov 26 Javascript
package.json各个属性说明详解
Mar 11 Javascript
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
解决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备份数据库类分享
2015/04/14 PHP
JavaScript XML实现两级级联下拉列表
2008/11/10 Javascript
html中使用javascript调用本地程序(exe、doc等)实现代码
2013/04/26 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
angular.element方法汇总
2015/01/07 Javascript
JavaScript更改原始对象valueOf的方法
2015/03/19 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
Document.body.scrollTop的值总为零的快速解决办法
2016/06/09 Javascript
JS产生随机数的几个用法详解
2016/06/22 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
全面解析标签页的切换方式
2016/08/21 Javascript
RequireJS 依赖关系的实例(推荐)
2017/01/21 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
WebSocket实现简单客服聊天系统
2017/05/12 Javascript
vue父组件通过props如何向子组件传递方法详解
2017/08/16 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
Python封装shell命令实例分析
2015/05/05 Python
进一步探究Python的装饰器的运用
2015/05/05 Python
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
Python实现对百度云的文件上传(实例讲解)
2017/10/21 Python
Python set常用操作函数集锦
2017/11/15 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
Python之用户输入的实例
2018/06/22 Python
Window环境下Scrapy开发环境搭建
2018/11/18 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
Django ValuesQuerySet转json方式
2020/03/16 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
日本小田急百货官网:Odakyu
2018/07/19 全球购物
介绍一下sql server的安全性
2014/08/10 面试题
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
应届大专生自荐书
2014/06/16 职场文书
大学体育课感想
2015/08/10 职场文书
Redis 常见使用场景
2021/08/30 Redis