解决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 相关文章推荐
jqeury eval将字符串转换json的方法
Jan 20 Javascript
灵活应用js调试技巧解决样式问题的步骤分享
Mar 15 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
May 09 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
Nov 26 Javascript
Bootstrap导航中表单简单实现代码
Mar 06 Javascript
node.js连接MongoDB数据库的2种方法教程
May 17 Javascript
如何通过非数字与字符的方式实现PHP WebShell详解
Jul 02 Javascript
js原生方法被覆盖,从新赋值原生的方法
Jan 02 Javascript
jsonp跨域获取数据的基础教程
Jul 01 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
Apr 12 Javascript
解决layui轮播图有数据不显示的情况
Sep 16 Javascript
详细分析vue表单数据的绑定
Jul 20 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
基于HBase Thrift接口的一些使用问题及相关注意事项的详解
2013/06/03 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
php实现断点续传大文件示例代码
2020/06/19 PHP
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
js浮动图片的动态效果
2013/07/10 Javascript
zTree插件之单选下拉菜单实例代码
2013/11/07 Javascript
js charAt的使用示例
2014/02/18 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
window.location.reload 刷新使用分析(去对话框)
2015/11/11 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
node.js版本管理工具n无效的原理和解决方法
2016/11/24 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
EasyUI的TreeGrid的过滤功能的解决思路
2017/08/08 Javascript
jQuery实现的简单拖拽功能示例【测试可用】
2018/08/14 jQuery
详解如何在Vue里建立长按指令
2018/08/20 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
Python利用itchat对微信中好友数据实现简单分析的方法
2017/11/21 Python
Django框架搭建的简易图书信息网站案例
2019/05/25 Python
python中metaclass原理与用法详解
2019/06/25 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
深入了解Python enumerate和zip
2020/07/16 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
2020/07/30 Python
Python调用飞书发送消息的示例
2020/11/10 Python
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
泰国演唱会订票网站:StubHub泰国
2018/02/26 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
大学生村官心得体会范文
2014/01/04 职场文书
政风行风整改报告
2014/11/06 职场文书
2014年车间工作总结
2014/11/21 职场文书