用vue-router的addRoute()方法来动态添加路由

18,861 阅读1分钟

一、router.addRoute()添加单个路由

(1)router.addRoute 可以动态添加一条新路由。若该路由有 name,并且已经存在一个与之相同的名字,则会覆盖它。

router.addRoute(route: RouteConfig): () => void

比如添加用户页面的路由:

router.addRoute({
                name: 'user',
                path: '/system/user',
                meta: {
                    title: '用户管理'
                },
                component: () => import('@/views/User.vue')//路由按需加载
            },)

(2)router.addRoute 还可以为现有路由添加子路由。

router.addRoute(parentName: string, route: RouteConfig): () => void

例如,为home页面添加菜单子路由:

router.addRoute('home',
    {
        name: 'menu',
        path: '/system/menu',
        meta: {
            title: '菜单管理'
        },
        component: () => import('@/views/Menu.vue')//路由按需加载
    },
)

二、router.addRoute()添加多个路由

在这里插入图片描述 当有多个路由时,也可以用router.addRoute()来添加:

//router.js
generateRoute(menuList) {
	//获取菜单权限中每个菜单的路由,包括半选和全选状态的权限
        let routes = []
        const deepList = (list) => {
            while (list.length) {
                let item = list.pop()
                if (item.action) {//二级菜单
                    routes.push({
                        name: item.component,
                        path: item.path,
                        meta: {
                            title: item.menuName
                        },
                        component: item.component
                    })
                }
                if (item.children && !item.action) {//一级菜单
                    deepList(item.children)
                }
            }
        }
        deepList(menuList)
        return routes;
    }

async function loadAsyncRoutes() {
	//从localStorage里获取存储的用户信息
    let userInfo = storage.getItem('userInfo') || {}
    if (userInfo.token) {
        try {
        	//获取菜单权限列表
            const { menuList } = await this.$api.getPermissionList()
            //获取所有新增路由对象数组
            let routes = this.generateRoute(menuList)
            //遍历每一个要渲染的路由
            routes.map(route => {
                let url = `./../views/${route.component}.vue`
                route.component = () => import(url);
                //每一个路由都添加进去
                router.addRoute("home", route);
            })
        } catch (error) {

        }
    }
}
loadAsyncRoutes();

同时在Login页面中也要添加以上代码:

Login.vue
......
<script>
export default {
  name: "login",
  data() {
    return {...}    
  },
  methods: {
    login() {
      this.$refs.userForm.validate((valid) => {
        if (valid) {
          this.$api.login(this.user).then(async (res) => {
            this.$store.commit("saveUserInfo", res);
            ***await this.loadAsyncRoutes();***
            this.$router.push("/welcome");
          });
        } else {
          return false;
        }
      });
    },
    ***async loadAsyncRoutes() {
      let userInfo = storage.getItem("userInfo") || {};
      if (userInfo.token) {
        try {
          const { menuList } = await this.$api.getPermissionList();
          let routes = utils.generateRoute(menuList);
          routes.map((route) => {
            let url = `./../views/${route.component}.vue`;
            route.component = () => import(url);
            this.router.addRoute("home", route);
          });
        } catch (error) {}
      }
    }***
  }
};
</script>