解决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 相关文章推荐
jquery原创弹出层折叠效果点击折叠弹出一个层
Mar 12 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
Mar 26 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
Jun 06 Javascript
JavaScript中的console.profile()函数详细介绍
Dec 29 Javascript
Javascript中拼接大量字符串的方法
Feb 05 Javascript
深入理解JS函数的参数(arguments)的使用
May 28 Javascript
JS实现HTML标签转义及反转义
Apr 14 Javascript
JS实现线性表的顺序表示方法示例【经典数据结构】
Apr 11 Javascript
vue增删改查的简单操作
Jul 15 Javascript
vue自定义filters过滤器
Apr 26 Javascript
ES6中异步对象Promise用法详解
Jul 31 Javascript
Vue循环中多个input绑定指定v-model实例
Aug 31 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+ajax 无刷新删除数据
2010/02/20 PHP
PHP文件缓存内容保存格式实例分析
2014/08/20 PHP
php+mysqli数据库连接的两种方式
2015/01/28 PHP
[原创]PHPCMS遭遇会员投稿审核无效的解决方法
2017/01/11 PHP
javascript题目,重写函数让其无限相加
2012/02/15 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
十个迅速提升JQuery性能让你的JQuery跑得更快
2012/12/10 Javascript
Jquery动态进行图片缩略的原理及实现
2013/08/13 Javascript
JS实现一键回顶功能示例代码
2013/10/28 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
JS实现点击按钮获取页面高度的方法
2015/11/02 Javascript
AngularJS ng-bind-html 指令详解及实例代码
2016/07/30 Javascript
jquery遍历标签中自定义的属性方法
2016/09/17 Javascript
jQuery Validate表单验证插件的基本使用方法及功能拓展
2017/01/04 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
JS FormData上传文件的设置方法
2017/07/05 Javascript
如何为vuex实现带参数的 getter和state.commit
2019/01/04 Javascript
详解vuex的简单todolist例子
2019/07/14 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
django rest framework之请求与响应(详解)
2017/11/06 Python
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
如何关掉pycharm中的python console(图解)
2019/10/31 Python
Python笔记之facade模式
2019/11/20 Python
快餐店的创业计划书范文
2014/01/29 职场文书
转让协议书范本
2014/04/15 职场文书
爱岗敬业演讲稿
2014/05/05 职场文书
2014全年工作总结
2014/11/27 职场文书
2014年标准化工作总结
2014/12/17 职场文书
2016父亲节感恩话语
2015/12/09 职场文书
青年干部培训班学习心得体会
2016/01/06 职场文书
求职信:会计求职的写作技巧
2019/04/24 职场文书
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android
Python采集股票数据并制作可视化柱状图
2022/04/04 Python
Win11软件图标固定到任务栏
2022/04/19 数码科技