解决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利用event.which方法获取键盘输入值的代码
Oct 09 Javascript
javascript数组操作总结和属性、方法介绍
Apr 05 Javascript
jquery实现右侧栏菜单选择操作
Mar 04 Javascript
Element-ui之ElScrollBar组件滚动条的使用方法
Sep 14 Javascript
如何获取vue单文件自身源码路径
May 06 Javascript
微信小程序实现卡片层叠滑动效果
Jun 21 Javascript
layui表单提交到后台自动封装到实体类的方法
Sep 12 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
Feb 24 Javascript
Vue watch响应数据实现方法解析
Jul 10 Javascript
js实现点击选项置顶动画效果
Aug 25 Javascript
Vue3+elementui plus创建项目的方法
Dec 01 Vue.js
js实现类选择器和name属性选择器的示例步骤
Feb 07 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中Session的概念
2006/10/09 PHP
PHP中cookie和session的区别实例分析
2014/08/28 PHP
php使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
php打包压缩文件之ZipArchive方法用法分析
2016/04/30 PHP
jquery 可拖拽的窗体控件实现代码
2010/03/21 Javascript
打造基于jQuery的高性能TreeView(asp.net)
2011/02/23 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
使用js+jquery实现无限极联动
2013/05/23 Javascript
js history对象简单实现返回和前进
2013/10/30 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
2015/12/01 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
Vue下的国际化处理方法
2017/12/18 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
WebSocket的通信过程与实现方法详解
2018/04/29 Javascript
vue项目中使用vue-i18n报错的解决方法
2019/01/13 Javascript
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
python实现指定字符串补全空格的方法
2015/04/30 Python
Python利用Beautiful Soup模块修改内容方法示例
2017/03/27 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
用Python3创建httpServer的简单方法
2018/06/04 Python
解决Python对齐文本字符串问题
2019/08/28 Python
python保留格式汇总各部门excel内容的实现思路
2020/06/01 Python
新入职员工的自我介绍演讲稿
2014/01/02 职场文书
秸秆管理实施方案
2014/03/15 职场文书
政府信息公开实施方案
2014/05/09 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
2014年保育员个人工作总结
2014/12/02 职场文书
工人先锋号事迹材料
2014/12/24 职场文书
2015最新民情日记范文
2015/06/26 职场文书
MySQL中order by的使用详情
2021/11/17 MySQL
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers