当前位置:首页 > VUE

vue 实现动态路由

2026-03-28 17:11:13VUE

实现动态路由的基本思路

动态路由的核心是根据用户权限或数据动态生成路由表。Vue Router 支持通过 addRoute 方法动态添加路由规则。

定义静态基础路由

静态路由是无需权限即可访问的页面(如登录页、404页等):

const constantRoutes = [
  {
    path: '/login',
    component: () => import('@/views/login.vue')
  },
  {
    path: '/404',
    component: () => import('@/views/404.vue')
  }
]

获取动态路由数据

通常从后端接口获取用户权限对应的路由配置,数据结构示例:

[
  {
    "path": "/dashboard",
    "component": "Layout",
    "children": [
      {
        "path": "index",
        "component": "dashboard/index"
      }
    ]
  }
]

路由数据转换

需要将后端返回的组件路径字符串转换为真正的组件:

function loadView(view) {
  return () => import(`@/views/${view}.vue`)
}

function filterAsyncRoutes(routes) {
  return routes.map(route => {
    if (route.component) {
      if (route.component === 'Layout') {
        route.component = Layout
      } else {
        route.component = loadView(route.component)
      }
    }
    if (route.children) {
      route.children = filterAsyncRoutes(route.children)
    }
    return route
  })
}

动态添加路由

在用户登录后或应用初始化时添加路由:

import router from './router'

const asyncRoutes = filterAsyncRoutes(backendRoutes)
asyncRoutes.forEach(route => {
  router.addRoute(route)
})

// 添加404兜底路由(需最后添加)
router.addRoute({ path: '/:pathMatch(.*)', redirect: '/404' })

路由权限控制

结合 Vue Router 的导航守卫实现权限校验:

router.beforeEach((to, from, next) => {
  if (hasToken()) {
    if (to.path === '/login') {
      next('/')
    } else {
      if (hasRoles()) {
        next()
      } else {
        getRoutes().then(routes => {
          // 动态添加路由逻辑
          next({ ...to, replace: true })
        })
      }
    }
  } else {
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next('/login')
    }
  }
})

菜单生成方案

动态路由通常需要配合动态菜单使用:

function generateMenu(routes) {
  return routes.filter(route => {
    if (route.meta && route.meta.hidden) return false
    if (route.children) {
      route.children = generateMenu(route.children)
    }
    return true
  })
}

常见问题处理

路由刷新404问题:需要确保服务器配置支持 History 模式:

location / {
  try_files $uri $uri/ /index.html;
}

路由重复添加问题:在添加动态路由前可先重置:

vue 实现动态路由

function resetRouter() {
  const newRouter = createRouter()
  router.matcher = newRouter.matcher
}

完整示例代码

// permission.js
router.beforeEach(async (to, from, next) => {
  if (store.getters.token) {
    if (!store.getters.routes.length) {
      const { routes } = await store.dispatch('user/getRoutes')
      const accessRoutes = await store.dispatch('permission/generateRoutes', routes)
      accessRoutes.forEach(route => {
        router.addRoute(route)
      })
      next({ ...to, replace: true })
    } else {
      next()
    }
  } else {
    next('/login')
  }
})

通过以上方案可以实现完整的动态路由系统,包括路由权限控制、菜单动态生成等功能。实际项目中可根据需求调整数据结构和权限校验逻辑。

标签: 路由动态
分享给朋友:

相关文章

vue路由实现内部切换

vue路由实现内部切换

Vue路由实现内部切换的方法 Vue Router是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。以下是几种常见的路由切换方式: 使用<router-link>组件 &l…

vue的路由实现

vue的路由实现

Vue 路由的实现方式 Vue 路由通常通过 Vue Router 实现,这是 Vue.js 官方提供的路由管理器。以下是 Vue 路由的核心实现步骤和配置方法。 安装 Vue Router 使用…

vue实现路由缓存

vue实现路由缓存

Vue 路由缓存实现方法 在 Vue 项目中,可以通过 keep-alive 组件和路由配置实现页面缓存,避免重复渲染和保持组件状态。 使用 keep-alive 包裹路由视图 在根组件或布局组件中…

vue动态实现表

vue动态实现表

Vue 动态实现表格的方法 使用 v-for 动态渲染表格 通过 Vue 的 v-for 指令可以动态渲染表格行和列。定义一个数组作为数据源,在模板中使用 v-for 遍历数组生成表格内容。 <…

vue实现动态浮出

vue实现动态浮出

Vue 实现动态浮出效果 动态浮出效果通常指根据用户交互(如点击、悬停)动态显示隐藏的浮层(如弹窗、菜单、提示框)。以下是几种实现方式: 使用 v-show 或 v-if 控制显示隐藏 通过 Vue…

vue实现路由匹配

vue实现路由匹配

Vue 路由匹配实现方法 在 Vue 中实现路由匹配通常使用 Vue Router 库。以下是核心实现方式: 基础路由配置 安装 Vue Router 后,在路由配置文件中定义路径与组件的映射关系:…