【VUE】使用bus总线时,第一次路由跳转时数据没成功传递的原因以及解决办法

bus总线是vue中路由跳转传递数据的常用方法,适用于传递数据不多的情况,但是在使用的过程中发现,bus总线在第一次路由跳转的时候总是不能够成功传递需要传递的数据。检查bus的配置以及调用方法,均没有出错,错就错在没有理解Vue的生命周期!!!

我们知道bus的 o n 的 监 听 应 该 位 于 on的监听应该位于 onemit之前,如果在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的时候,控制台的打印情况如下:
在这里插入图片描述

从上图便可以发现,bus第一次使用无法传递的原因:

在页面1通过 e m i t 方 法 传 递 数 据 然 后 跳 转 路 由 的 时 候 , 其 实 页 面 2 的 emit方法传递数据然后跳转路由的时候,其实页面2的 emit2on监听还没有建立,因此无法得到数据!

基于上述原因,提出的解决办法如下:

在页面1的beforeDestroy或者destroyed钩子函数中emit数据,在页面2的beforeCreate、created或者beforeMount钩子函数中建立 o n 监 听 事 件 , 然 后 在 页 面 2 的 m o u n t e d 钩 子 函 数 中 on监听事件,然后在页面2的mounted钩子函数中 on2mountedon得到的数据赋值给页面2的变量中。

//页面1
  beforeDestroy () {
        bus.$emit('dataFromBus1',this.dataFromBus1);
  },
   //页面2
     beforeCreate () {
        bus.$on('dataFromBus1',function(url){
            bus.dataFromBus1 = url
        });        
    },    
    mounted () {
        this.dataFromBus1 = bus.dataFromBus1;       
    },

在这里插入图片描述
在这里插入图片描述
可以发现,第一次跳转的时候页面2就能够得到传递的数据!!!

————————————————
版权声明:本文为CSDN博主「bdlaxx」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mianyao1004/article/details/92382461

Vue3 Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。在使用 Vue3 Router 进行页面跳转,常常需要携带一些数据,可以通过几种方式实现。 1. 使用路由查询参数(query)传递数据: 在进行路由跳转,可以将数据作为查询参数添加到 URL 中。例如: ```javascript // 导航到新的路由传递查询参数 this.$router.push({ name: 'routeName', query: { key: 'value' } }); // 或者使用路由对象 this.$router.push({ path: '/path', query: { key: 'value' } }); ``` 在目标路由组件中,可以通过 `this.$route.query` 来访问这些数据。 2. 使用路由的 params 传递数据: 如果要将数据作为路由的一部分传递,可以使用 params。首先确保路由配置中使用了动态段(如 `/user/:id`): ```javascript // 导航到新的路由传递 params this.$router.push({ name: 'routeName', params: { id: 123 } }); // 或者使用路由对象 this.$router.push({ path: '/user/123' }); ``` 在目标路由组件中,可以通过 `this.$route.params` 来访问这些数据。 3. 使用事件传递数据: 有候,你可能需要在不跳转路由的情况下传递数据。可以使用事件总线(Event Bus)或者 Vuex 状态管理来实现跨组件的数据传递。 需要注意的是,使用 params 传递数据,如果 params 的值为空,那么这个路由可能不会被正确地记录在浏览器的 history 中,这可能会影响到浏览器的前进后退功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值