vue 后端返回路由 添加动态路由

Posted 原谅我一生不羁放歌搞文艺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue 后端返回路由 添加动态路由相关的知识,希望对你有一定的参考价值。

参考链接1:https://blog.csdn.net/qq_31906983/article/details/89054798
参考链接2:https://blog.csdn.net/qq_31906983/article/details/88942965

思路:
路由表不在前端进行比对,后台对用户的权限进行比对,返回给前端一个比对好的路由表,且返回的路由表

  {
    path: \'/people\',
    name: \'people\',
    meta: {
      title: \'人口管理\',
      requireAuth: true
    },
    component: () => import(\'@/views/main/Main\'),
    children: [{
      path: \'/people-list\',
      name: \'people-list\',
      meta: {
        icon: \'el-icon-user-solid\',
        title: \'人口管理\',
        requireAuth: true
      },
      component: () => import(\'@/views/people/list\')
    }, {
      path: \'/people-detail\',
      name: \'people-detail\',
      meta: {
        requireAuth: true,
        notCache: true,
        hideInMenu: true,
        title: route => `人口详情-${route.query.xm}`
      },
      component: () => import(\'@/views/people/detail\')
    }]
  }
function filterRouter (routes) {
  const router = routes.map(route => {
    if (route.component === \'main\') {
      route.component = _import(\'/main/Main\')
    } else {
      route.component = _import(route.component)
    }
    if (route.meta.routeTitle) {
      route.meta.title = _title(route.meta.title, route.meta.routeTitle)
    }
    if (route.children && route.children.length > 0) {
      route.children = filterRouter(route.children)
    }
    return route
  })
  return router
}

这个函数的主要作用就是把后台传过来的字符串型的component转化为真正的组件
其中_import()函数的定义如下:

function _import (file) {
  return () => import(\'@/views\' + file + \'.vue\')
}
function _title (title, routeTitle) {
  return route => `${title}${route.query[routeTitle]}`
}

使用router.onReady 调用一下获取的动态路由

router.onReady(() => generateRoutes())
function generateRoutes () {
  let vueMenus = localStorage.vueMenus
  if (vueMenus) {
    vueMenus = JSON.parse(vueMenus)
    const filterRoutes = filterRouter(vueMenus)
    // console.log(\'filterRoutes\', filterRoutes)
    filterRoutes.map(item => {
      // console.log(\'item\', item)
      router.addRoute(item)
    })
    router.addRoute({
      path: \'*\',
      meta: {
        hideInMenu: true
      },
      component: _import(\'/main/NotFound\')
    })
    router.options.routes = router.options.routes.concat(filterRoutes)
    // console.log(router.options.routes)
  }
}

接着更新,发现以上使用完之后,刷新页面是空白的。
所以直接改 【参考链接2】的方式 使用vuex

store/module/routeList.js

import router from \'@/router/index\'
import { filterRouter } from \'@/libs/util\'
export default {
  state: {
    routeList: []
  },
  mutations: {
    setRouteList (state, list) {
      const vueMenus = list || []
      if (vueMenus.length > 0) {
        vueMenus.push({
          path: \'*\',
          meta: {
            hideInMenu: true
          },
          component: \'/main/NotFound\'
        })
        const filterRoutes = filterRouter(vueMenus)
        filterRoutes.map(item => {
          router.addRoute(item)
        })
        state.routeList = vueMenus
      }
    }
  },
  actions: {
    setRouteListByLocal ({ commit }) {
      return new Promise((resolve, reject) => {
        Api.setVueMenu().then(res => {
          if (res.code === \'C10000\') {
            commit(\'setRouteList\', res.data)
            resolve(res)
          } else {
            reject(res)
          }
        }).catch(err => {
          reject(err)
        })
      })
    }
  }
}

router/index.js


router.beforeEach((to, from, next) => {

if (!token的判断) {
    next(\'/login\')
} else {
    if (store.state.routeList.routeList.length === 0) {
      // 重置路由 start
      const newRouter = new VueRouter({
        mode: \'history\',
        base: process.env.BASE_URL,
        routes
      })
      router.matcher = newRouter.matcher
      // 重置路由 end
      store.dispatch(\'setRouteListByLocal\').then(() => {
        next({ path: to.path })
        console.log(store.state.routeList.routeList)
      })
    } else {
      next()
    }
}
    
})

菜单就使用 this.menuList = store.state.routerList.routerList

退出登录的时候 需要清空一下 this.$store.state.routeList.routeList

以上是关于vue 后端返回路由 添加动态路由的主要内容,如果未能解决你的问题,请参考以下文章

Vue router4 addRoute动态添加路由,子路由;路由添加后刷新白屏

vue-admin-template动态添加路由,刷新页面路由失效问题

Vue实现动态路由

vue-router 动态添加 路由

Vue权限控制——动态注册路由

Vue权限控制——动态注册路由