解决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 相关文章推荐
漂亮的仿flash菜单,来自蓝色经典
Jun 26 Javascript
JavaScript编写简单的计算器
Nov 25 Javascript
微信小程序 选择器(时间,日期,地区)实例详解
Nov 16 Javascript
详解创建自定义的Angular Schematics
Jun 06 Javascript
vue实现自定义多选与单选的答题功能
Jul 05 Javascript
jquery获取select选中值的文本,并赋值给另一个输入框的方法
Aug 21 jQuery
微信小程序实现签到功能
Oct 31 Javascript
vue中使用codemirror的实例详解
Nov 01 Javascript
Node.js如何对SQLite的async/await封装详解
Feb 14 Javascript
JS模拟浏览器实现全局搜索功能
Sep 11 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
Jul 17 Javascript
八种Vue组件间通讯方式合集(推荐)
Aug 18 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遍历数组的几种方法
2012/03/22 PHP
php通过strpos查找字符串出现位置的方法
2015/03/17 PHP
PHP编程中尝试程序并发的几种方式总结
2016/03/21 PHP
filters.revealTrans.Transition使用方法小结
2010/08/19 Javascript
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
滚动条响应鼠标滑轮事件实现上下滚动的js代码
2014/06/30 Javascript
使用百度地图api实现根据地址查询经纬度
2014/12/11 Javascript
基于jQuery实现Div窗口震动特效代码-代码简单
2015/08/28 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
2015/09/14 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
2016/02/06 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
学习Javascript闭包(Closure)知识
2016/08/07 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
微信小程序实现图片压缩
2019/12/03 Javascript
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
python学习之编写查询ip程序
2016/02/27 Python
在Python web中实现验证码图片代码分享
2017/11/09 Python
python基于twisted框架编写简单聊天室
2018/01/02 Python
python得到一个excel的全部sheet标签值方法
2018/12/10 Python
Python基于requests实现模拟上传文件
2020/04/21 Python
Python 发送邮件方法总结
2020/08/10 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
tensorflow2.0教程之Keras快速入门
2021/02/20 Python
英国日常交易网站:Wowcher
2018/09/04 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
当文件系统受到破坏时,如何检查和修复系统?
2012/03/09 面试题
煤矿机修工岗位职责
2014/02/07 职场文书
先进事迹演讲稿
2014/09/01 职场文书
法制教育演讲稿
2014/09/10 职场文书
2014年公务员退休工资改革方案
2014/10/01 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
2019年英语版感谢信(8篇)
2019/09/29 职场文书
慰问信(范文3篇)
2019/10/23 职场文书
MySQL表锁、行锁、排它锁及共享锁的使用详解
2022/04/02 MySQL