当前位置:   article > 正文

vue饿了么webapp之router-view传值(深坑!!)(evenBus的使用)_router-view$emit无效

router-view$emit无效

首先,想要在app.vue组件里面请求获取到商品的信息seller,想把seller通过router-view传递给当前router-view所显示的组件good.vue,在good里面使用seller,别人也是这样子写的,一点问题也没有:

App.vue


good.vue



然后就报错了。。。


vue开发者工具也显示good的props的seller是undefined的



然而,我现在还不知道这是为什么,代码也和别人的一摸一样,但是就是不能传值。唯一不同的就是,别人的vue-router版本是2.1,而我的是2.7,难道是因为这个原因吗?我也怀疑是版本问题。。。

真烦,然后我就只能通过evenbus传值了,当然vuex也可以,我这里先使用evenbus。


先在main.js声明一个全局的evenbus



然后我需要在app.vue这里把seller广播出去,使用evenBus.$emit('seller',seller),第一个参数是广播的事件名,其他组件通过这个事件名来监听这个事件,如果evenbus会复用,记得不要起重复的名字;第二个参数是你传递的值。



然后在你需要使用seller的组件监听该事件evenBus.$on('seller',this.setseller),第一个参数是事件名,第二个是回调函数,该函数的参数就是监听到传过来的seller

注意, evenBus.$emit是瞬时性的,因此使用 evenBus.$emit派发事件时,evenBus.$on要已经在监听了,就是evenBus.$on要比emit先执行,否则无法接收到事件。

如果涉及到路由,由于路由是先加载到新路由,再进行旧路由的销毁,因此要在新路由的created()里面evenBus.$on,旧路由的destory里面evenBus.$emit




evenBus. $emit( 'userName', this. userName)
evenBus. $emit( 'userName', this. userName)


--------------------------------------------------------分割线-------------------------------------------------------------------

现在,通过router-view上传值可以获取了,其实应该是我写错了...

在main.js中

  1. const routes=[
  2. {
  3. path:'/',
  4. redirect:'/goods'
  5. },
  6. {
  7. path: '/goods',
  8. component: goods
  9. },
  10. {
  11. path: '/rating',
  12. component: rating
  13. },
  14. {
  15. path: '/seller',
  16. component: seller
  17. }
  18. ]

在app.vue中:

  1. <div id="app">
  2. <v-header :seller="seller"></v-header>
  3. <div class="tab border-1px">
  4. <div class="tab-item">
  5. <router-link to="goods">商品</router-link>
  6. </div>
  7. <div class="tab-item">
  8. <router-link to="/rating">评论</router-link>
  9. </div>
  10. <div class="tab-item">
  11. <router-link to="/seller">商家</router-link>
  12. </div>
  13. </div>
  14. <div class="content">
  15. <keep-alive>
  16. <router-view :seller="seller"></router-view>
  17. </keep-alive>
  18. </div>
  19. </div>

一开始,我觉得goods、rating、seller应该作为子组件放在根下面,但是,得到的结果是,在app.vue的router-view里面会把原来在app.vue的也显示出来..

在跟路径下是直接进入到app.vue组件,如果给跟路径设定redirect重定向,重定向的组件会显示在router-view当中,这样才是正确的。

与以下这种情况比较:

router:

  1. {
  2. path:'/',
  3. redirect:'/login'
  4. },
  5. {
  6. path: '/login',
  7. component: Login
  8. },
  9. {
  10. path:'/root',
  11. component: Root,
  12. redirect:'/root/main/root',
  13. children:[
  14. {
  15. path:'main/:type',
  16. component:Main,
  17. name:'首页',
  18. meta: {
  19. requireAuth: true, // 添加该字段,表示进入这个路由是需要登录的
  20. },
  21. },
  22. {
  23. path: 'purchase-exl',
  24. component: purchaseExl,
  25. name:'进货统计报表',
  26. meta: {
  27. requireAuth: true,
  28. },
  29. },
  30. {
  31. path: 'medicine-list',
  32. component: medicineList,
  33. name: '药品列表',
  34. meta: {
  35. requireAuth: true,
  36. },
  37. },
  38. {
  39. path: 'user-list',
  40. component: userList,
  41. name: '用户列表',
  42. meta: {
  43. requireAuth: true,
  44. },
  45. },
  46. {
  47. path: 'factory',
  48. component: factory,
  49. name: '厂商管理',
  50. meta: {
  51. requireAuth: true,
  52. },
  53. },
  54. {
  55. path: 'returnFactory-exl',
  56. component: returnFactoryExl,
  57. name: '仓库退货统计报表',
  58. meta: {
  59. requireAuth: true,
  60. },
  61. },
  62. {
  63. path: 'sellReturn-exl',
  64. component: sellReturn,
  65. name: '销售退货统计报表',
  66. meta: {
  67. requireAuth: true,
  68. },
  69. },
  70. {
  71. path: 'sellRecord-exl',
  72. component: sellRecord,
  73. name: '售出统计报表',
  74. meta: {
  75. requireAuth: true,
  76. },
  77. },
  78. {
  79. path: 'factory',
  80. component: factory,
  81. name: '查看厂商列表',
  82. meta: {
  83. requireAuth: true,
  84. },
  85. },
  86. {
  87. path: 'saleroom-graph',
  88. component: saleroomGraph,
  89. name: '查看药店销额统计图',
  90. meta: {
  91. requireAuth: true,
  92. },
  93. },
  94. {
  95. path: 'sales-volume-graph',
  96. component: salesVolumeGraph,
  97. name: '查看药品销量统计图',
  98. meta: {
  99. requireAuth: true,
  100. },
  101. }
  102. ]
  103. },

app.vue

  1. <template>
  2. <div id="app">
  3. <router-view></router-view>
  4. </div>
  5. </template>

在跟路径下访问该路由,进入到app组件,该组件只有一个router-view,而且重定向到login,因此整个页面显示是login,实际也是包裹在app组件当中的。

然后,在跳转到其他路由当中,例如root,也重定向到了他其中一个子路由,由于子路由是依赖于root的,因此把root原有的内容加上子路由才是完整页面。

因此,子路由的意义是切换url时仅仅改变router-view的路由

一般来讲,redirect适用于当前path的组件里面有router-view,让它可以显示默认的组件。redirect不一定只能重定向到它的子路由,其他路由也是可以的,如果重定向到其他路由,则整个页面都显示其他路由的页面。

因此,在跟路由下的重定向和其他路由的重定向不一样。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/132369?site
推荐阅读
相关标签
  

闽ICP备14008679号