实现思路:
1,需要在静态路由的基础上用vue路由上面的addRoute()方法来动态添加路由,最后生成我们需要的路由
2,封装添加路由的方法,在刷新页面时重新生成路由
首先创建静态路由
| |
| export const basicRoutes = [ |
| { |
| path: '/', |
| redirect: '/login', |
| }, |
| { |
| path: '/login', |
| name: 'login', |
| component: () => import('@/views/login/index.vue'), |
| }, |
| |
| { |
| path: '/hideLogin', |
| name: 'hideLogin', |
| component: () => import('@/views/hideLogin/index.vue'), |
| }, |
| { |
| |
| path: '/errorPage', |
| component: () => import('@/components/error-page/404'), |
| name: '404', |
| }, |
| ] |
复制
创建路由的时候引入
| import { createRouter, createWebHistory } from 'vue-router' |
| import { basicRoutes as routes } from './routes' |
| |
| export const router = createRouter({ |
| history: createWebHistory('/'), |
| routes, |
| scrollBehavior: () => ({ left: 0, top: 0 }), |
| }) |
| export default router |
复制
封装处理路由方法
| import { deepClone } from '@/utils/utils' |
| import router from './index' |
| |
| export const formatRouterTree = (data) => { |
| let parents = data.filter((i) => i.pid === 0), |
| children = data.filter((item) => item.pid !== 0) |
| dataToTree(parents, children) |
| function dataToTree(parents, children) { |
| parents.map((p) => { |
| children.map((c, i) => { |
| let _c = deepClone(children) |
| _c.splice(i, 1) |
| dataToTree([c], _c) |
| if (p.children) { |
| p.children.push(c) |
| } else { |
| p.children = [c] |
| } |
| }) |
| }) |
| } |
| } |
| |
| |
| const modules = import.meta.glob([ |
| '../views/*.vue', |
| '../views/*/*.vue', |
| '../views/*/*/*.vue', |
| '../components/layout/index.vue', |
| ]) |
| |
| |
| export const generateRouter = (userRouters) => { |
| let newRouter = null |
| if (userRouters) |
| newRouter = userRouters.map((i) => { |
| let routes = { |
| path: i.pathUrl, |
| name: i.name, |
| |
| component: |
| i.pathUrl === '/layout' |
| ? modules[`../components/layout/index.vue`] |
| : modules[`../views${i.pathUrl}/index.vue`], |
| } |
| if (i.children) { |
| routes.children = generateRouter(i.children) |
| } |
| return routes |
| }) |
| return newRouter |
| } |
| |
| |
| |
| |
| export function setAddRoute(routes) { |
| if (routes && routes.length > 0) |
| routes.forEach((route) => { |
| const routeName = route.name |
| if (!router.hasRoute(routeName)) router.addRoute(route) |
| }) |
| } |
复制
在store中写一个调用方法
| import { defineStore } from 'pinia' |
| import { generateRouter, setAddRoute } from '@/router/vue-router.js' |
| export const routeStore = defineStore('route', { |
| state: () => { |
| return { |
| } |
| }, |
| actions: { |
| addRouter() { |
| |
| |
| let find = JSON.parse(window.localStorage.getItem('routerList')) |
| let routerList = generateRouter(find) |
| |
| setAddRoute(routerList) |
| }, |
| }, |
| getters: {}, |
| }) |
复制
登陆时存储路由信息
| import { generateRouter, setAddRoute } from '@/router/vue-router.js' |
| |
| Login.Login(params).then(async (res) => { |
| if (res.code === 200) { |
| |
| |
| |
| let routerList = await getRouterList(params) |
| |
| window.localStorage.setItem('routerList', routerList) |
| |
| |
| let list = generateRouter(routerList) |
| |
| setAddRoute(list) |
| |
| |
| router.push('首页') |
| ElMessage.success('登陆成功') |
| } |
| }) |
复制
解决刷新消失
上面只是在登陆时候添加了路由,点击刷新页面后会消失,需要在main.js中配置一下
| import { createPinia } from 'pinia' |
| import { routeStore } from '@/store/modules/routeMenu.js' |
| const store = createPinia() |
| const app = createApp(App) |
| app.use(store) |
| let routeStores = routeStore() |
| const addRouter = () => { |
| routeStores.addRouter() |
| } |
| addRouter() |
| |
| app.use(router) |
复制