vue3+vite+vue-router4.x实现动态添加路由

实现内容:

        1.根据后台返回的菜单,前端实现动态添加路由;

        2.解决刷新页面时,路由消失/页面空白的问题;

第一步:请求后台,返回菜单数据【内容如下】

// 后台返回的菜单数据
this.menuList = [
        { id: 1, path: '/home', name: '首页', icon: true, children: [], component: '/home/home' },
        { id: 12, path: '/pinia', name: 'pinia的使用', icon: true, children: [], component: '/pinia/pinia' },
        { id: 2, path: '/menu', name: '递归菜单页面', icon: true, children: [], component: '/recursion-menu/recursion-menu' },
        { id: 3, path: '/test', name: '测试', icon: true, children: [], component: '/test/test' },
        {
          id: 10,
          path: '/permisson',
          name: '权限管理',
          icon: true,
          children: [
            { id: '10-1', path: '/user', name: '用户管理', children: [], component: '/promission/user-manage' },
            { id: '10-2', path: '/role', name: '角色管理', children: [], component: '/promission/roles-manage' }
          ]
        }
      ]

第二步:根据菜单数据,动态添加到路由信息中

1.静态路由【routes.ts文件】

import { RouteRecordRaw } from 'vue-router'

const Login = () => import('@/views/login/login.vue')
const Home = () => import('@/views/home/home.vue')
const Layout = () => import('@/layout/layout.vue')
const Page404 = () => import('@/views/error/page404.vue')

// 基础路由,不需要设置权限
export const basicRoutes:RouteRecordRaw[] = [
  {
    path: '/login',
    name: 'login',
    component: Login
  }, {
    path: '/',
    name: 'layout',
    component: Layout,
    meta: {
      requiresAuth: true // 在这里设置,表示layout下边的子路由全部需要登录才能访问
    },
    redirect: '/home',
    children: [
      {
        path: '/home',
        name: 'home',
        component: Home
      }
    ]
  }, {
    path: '/:pathMatch(.*)',
    name: 'page404',
    component: Page404
  }
]

2.基础路由信息【index.ts】

import { createRouter, createWebHashHistory } from 'vue-router'
import { basicRoutes } from '@/router/routes'
import { App } from 'vue'
import { setupRouterHooks } from '@/router/routerHooks'

export const router = createRouter({
  history: createWebHashHistory(),
  routes: basicRoutes
})

export function setupRouter (app: App<Element>): void {
  // 路由钩子函数
  setupRouterHooks()
  app.use(router)
}

export default router

 3.将数据动态添加到路由信息中【routerHooks.ts文件】

addRoutes(this.menuList) // 此处的menuList为上述中返回的数据


import { router } from '@/router/index'
import type { MenuItem } from '@/pinia/modules/menu'
import { RouteRecordRaw } from 'vue-router'

// vue3 + vite中的动态引入组件的方法
const loadView = import.meta.glob('../views/**/*.vue')

// 动态添加路由
export function addRoutes (menu: MenuItem[]) {
  menu.forEach(e => {
    // 只将页面信息添加到路由中
    if (!e.children || e.children.length === 0) {
      router.addRoute('layout', { name: e.path.slice(1), path: e.path, meta: { title: e.name }, component: loadView[`../views${e.component}.vue`] })
    } else {
      addRoutes(e.children)
    }
  })
}

第三步:添加路由钩子,解决页面刷新,路由消失的问题【routerHelper.ts】

import { router } from '@/router/index'
import nprpgreee from 'nprogress'
import 'nprogress/nprogress.css'
import { useMenuStoreWithOut } from '@/pinia/modules/menu'

const menuStore = useMenuStoreWithOut()

export function setupRouterHooks () {
  router.beforeEach((to, from, next) => {
    nprpgreee.start() // 开始加载进度条
    if (to.path === '/login') {
      next()
    } else {
      // 页面刷新时,重新加载路由
      if (menuStore.menuList.length === 0) {
        menuStore.setMenuList()
        next({ path: to.path })
        // next({ ...to, replace: true }) //此方法不生效
      } else {
        next()
      }
    }
  })
  router.afterEach(() => {
    nprpgreee.done()
  })
}

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,下面是搭建后台管理系统的简单步骤: 1. 创建项目 使用 Vue CLI 创建项目,选择 vue3 preset,安装完成后进入项目目录。 ``` vue create my-project cd my-project ``` 2. 安装依赖包 安装 vitevue-router 和 element-plus。 ``` npm install vite vue-router@4 element-plus --save ``` 安装 pinia 和 echarts。 ``` npm install pinia echarts@5 --save ``` 3. 配置 vite 在根目录下创建 `vite.config.js` 文件,配置 alias 和 server。 ```js import path from 'path' import { defineConfig } from 'vite' export default defineConfig({ resolve: { alias: { '@': path.resolve(__dirname, 'src'), }, }, server: { port: 3000, open: true, }, }) ``` 4. 配置路由 在 `src` 目录下创建 `router` 文件夹,并创建 `index.js` 文件,配置路由。 ```js import { createRouter, createWebHistory } from 'vue-router' import Home from '@/views/Home.vue' const routes = [ { path: '/', name: 'Home', component: Home, }, ] const router = createRouter({ history: createWebHistory(), routes, }) export default router ``` 在 `src` 目录下的 `main.js` 中引入路由。 ```js import { createApp } from 'vue' import App from './App.vue' import router from './router' const app = createApp(App) app.use(router) app.mount('#app') ``` 5. 配置状态管理 在 `src` 目录下创建 `store` 文件夹,并创建 `index.js` 文件,配置状态管理。 ```js import { createPinia } from 'pinia' const store = createPinia() export default store ``` 在 `src` 目录下的 `main.js` 中引入状态管理。 ```js import { createApp } from 'vue' import App from './App.vue' import router from './router' import store from './store' const app = createApp(App) app.use(router) app.use(store) app.mount('#app') ``` 6. 配置 UI 框架 在 `src` 目录下的 `main.js` 中引入 element-plus。 ```js import { createApp } from 'vue' import App from './App.vue' import router from './router' import store from './store' import ElementPlus from 'element-plus' import 'element-plus/lib/theme-chalk/index.css' const app = createApp(App) app.use(router) app.use(store) app.use(ElementPlus) app.mount('#app') ``` 7. 配置 echarts 在 `src` 目录下的 `main.js` 中引入 echarts。 ```js import { createApp } from 'vue' import App from './App.vue' import router from './router' import store from './store' import ElementPlus from 'element-plus' import 'element-plus/lib/theme-chalk/index.css' import * as echarts from 'echarts' const app = createApp(App) app.use(router) app.use(store) app.use(ElementPlus) app.config.globalProperties.$echarts = echarts app.mount('#app') ``` 8. 创建页面 在 `src` 目录下创建 `views` 文件夹,并创建页面组件。 9. 创建布局 在 `src` 目录下创建 `layouts` 文件夹,并创建布局组件。 10. 配置路由和布局 在 `router/index.js` 中配置路由和布局。 ```js import { createRouter, createWebHistory } from 'vue-router' import Layout from '@/layouts/Layout.vue' import Home from '@/views/Home.vue' const routes = [ { path: '/', component: Layout, children: [ { path: '', name: 'Home', component: Home, }, ], }, ] const router = createRouter({ history: createWebHistory(), routes, }) export default router ``` 11. 运行项目 在项目根目录下运行 `npm run dev`,打开浏览器访问 `http://localhost:3000` 查看效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值