vue权限路由实现的方法示例总结

2020-06-13 10:32:42易采站长站整理

实现

前端统一定义路由组件,比如


const Home = () => import("../pages/Home.vue");
const UserInfo = () => import("../pages/UserInfo.vue");
export default {
home: Home,
userInfo: UserInfo
};

将路由组件定义为这种key-value的结构。

后端返回格式


[
{
name: "home",
path: "/",
component: "home"
},
{
name: "home",
path: "/userinfo",
component: "userInfo"
}
]

在将后端返回路由通过addRoutes动态挂载之间,需要将数据处理一下,将component字段换为真正的组件。

至于菜单与路由是否还要分离,怎么对应,可以根据实际需求进行处理。

如果有嵌套路由,后端功能设计的时候,要注意添加相应的字段。前端拿到数据也要做相应的处理。

缺点

全局路由守卫里,每次路由跳转都要做判断
前后端的配合要求更高

不使用全局路由守卫

前面几种方式,除了登录页与主应用分离,每次路由跳转,都在全局路由守卫里做了判断。

实现

应用初始化的时候只挂载不需要权限控制的路由


const constRouterMap = [
{
name: "login",
path: "/login",
component: () => import("@/pages/Login.vue")
},
{
path: "/404",
component: () => import("@/pages/Page404.vue")
},
{
path: "/init",
component: () => import("@/pages/Init.vue")
},
{
path: "*",
redirect: "/404"
}
];


export default constRouterMap;
import Vue from "vue";
import Router from "vue-router";
import ConstantRouterMap from "./routers";

Vue.use(Router);

export default new Router({
// mode: 'history', // require service support
scrollBehavior: () => ({ y: 0 }),
routes: ConstantRouterMap
});

登录成功后跳到/路由


submitForm(formName) {
let _this=this;
this.$refs[formName].validate(valid => {
if (valid) {
_this.$store.dispatch("loginByUserName",{
name:_this.ruleForm2.name,
pass:_this.ruleForm2.pass
}).then(()=>{
_this.$router.push({
path:'/'
})
})
} else {

return false;
}
});
}

因为当前没有/路由,会跳到/404


<template>
<h1>404</h1>
</template>
<script>
export default {
name:'page404',
mounted(){
if(!this.$store.state.isLogin){
this.$router.replace({ path: '/login' });