【发布时间】:2019-12-16 16:22:58
【问题描述】:
我有应用程序,用户可以在其中以不同的角色登录,例如。 seller、buyer 和 admin。
对于每个用户,我想在同一路径上显示仪表板页面,例如。 http://localhost:8080/dashboard
但是,每个用户将在不同的 vue 组件中定义不同的仪表板,例如。 SellerDashboard、BuyerDashboard 和 AdminDashboard。
所以基本上,当用户打开http://localhost:8080/dashboard 时,vue 应用程序应该根据用户角色(我存储在 vuex 中)加载不同的组件。同样,我想将它用于其他路线。例如,当用户进入个人资料页面时,http://localhost:8080/profile 应用程序应该根据登录的用户显示不同的个人资料组件。
所以我想为所有用户角色设置相同的路由,而不是为每个用户角色设置不同的路由,例如。我不希望用户角色包含在 url 中,如下所示:http://localhost:8080/admin/profile 和 http://localhost:8080/seller/profile 等...
如何用 vue 路由器实现这个场景?
我尝试使用子路由和每个路由保护 beforeEnter 的组合来解析基于用户角色的路由。这是一个代码示例:
在 router.js 中:
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
import store from '@/store'
Vue.use(VueRouter)
const routes = [
{
path: '/',
name: 'home',
component: Home,
beforeEnter: (to, from, next) => {
next({ name: store.state.userRole })
},
children: [
{
path: '',
name: 'admin',
component: () => import('@/components/Admin/AdminDashboard')
},
{
path: '',
name: 'seller',
component: () => import('@/components/Seller/SellerDashboard')
},
{
path: '',
name: 'buyer',
component: () => import('@/components/Buyer/BuyerDashboard')
}
]
},
]
const router = new VueRouter({
mode: 'history',
base: process.env.BASE_URL,
routes
})
export default router
在 store.js 中:
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
userRole: 'seller' // can also be 'buyer' or 'admin'
}
})
App.vue 包含顶级路由的父路由视图,例如。将/ 映射到Home 组件,将/about 映射到About 组件:
<template>
<router-view/>
</template>
<script>
export default {
name: 'App',
}
</script>
而 Home.vue 包含嵌套的router-view 用于不同用户的基于角色的组件:
<template>
<div class="home fill-height" style="background: #ddd;">
<h1>Home.vue</h1>
<!-- nested router-view where user specific component should be rendered -->
<router-view style="background: #eee" />
</div>
</template>
<script>
export default {
name: 'home'
}
</script>
但这不起作用,因为当我在beforeEnter 中调用next({ name: store.state.userRole }) 时,我在浏览器控制台中收到Maximum call stack size exceeded 异常。例外是:
vue-router.esm.js?8c4f:2079 RangeError: Maximum call stack size exceeded
at VueRouter.match (vue-router.esm.js?8c4f:2689)
at HTML5History.transitionTo (vue-router.esm.js?8c4f:2033)
at HTML5History.push (vue-router.esm.js?8c4f:2365)
at eval (vue-router.esm.js?8c4f:2135)
at beforeEnter (index.js?a18c:41)
at iterator (vue-router.esm.js?8c4f:2120)
at step (vue-router.esm.js?8c4f:1846)
at runQueue (vue-router.esm.js?8c4f:1854)
at HTML5History.confirmTransition (vue-router.esm.js?8c4f:2147)
at HTML5History.transitionTo (vue-router.esm.js?8c4f:2034)
因此没有渲染任何内容。
有什么办法可以解决这个问题吗?
【问题讨论】:
标签: javascript vue.js vuex vue-router