当前位置:首页 > VUE

vue实现登录动态路由

2026-01-20 06:09:53VUE

实现登录动态路由的基本思路

动态路由的核心是根据用户权限或角色,在登录后动态加载可访问的路由表。Vue Router 提供了 addRoutes 方法(Vue Router 4.x 使用 addRoute)实现这一功能。

定义静态路由和动态路由

静态路由包括无需权限的页面(如登录页、404页),动态路由则根据用户权限生成:

vue实现登录动态路由

// 静态路由
const constantRoutes = [
  { path: '/login', component: Login },
  { path: '/404', component: NotFound }
]

// 动态路由(示例)
const asyncRoutes = [
  { path: '/admin', component: Admin, meta: { roles: ['admin'] } },
  { path: '/user', component: User, meta: { roles: ['user', 'admin'] } }
]

路由守卫处理登录逻辑

在全局前置守卫中检查用户权限,动态添加路由:

router.beforeEach(async (to, from, next) => {
  const hasToken = localStorage.getItem('token')

  if (to.path === '/login') {
    next()
    return
  }

  if (!hasToken) {
    next('/login')
    return
  }

  if (store.getters.routes.length === 0) {
    try {
      const roles = await store.dispatch('user/getUserInfo')
      const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
      router.addRoutes(accessRoutes)
      next({ ...to, replace: true })
    } catch (error) {
      next('/login')
    }
  } else {
    next()
  }
})

Vuex 状态管理

通过 Vuex 管理路由状态和权限数据:

vue实现登录动态路由

const store = new Vuex.Store({
  state: {
    routes: [],
    addRoutes: []
  },
  mutations: {
    SET_ROUTES: (state, routes) => {
      state.addRoutes = routes
      state.routes = constantRoutes.concat(routes)
    }
  },
  actions: {
    generateRoutes({ commit }, roles) {
      return new Promise(resolve => {
        let accessedRoutes
        if (roles.includes('admin')) {
          accessedRoutes = asyncRoutes
        } else {
          accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
        }
        commit('SET_ROUTES', accessedRoutes)
        resolve(accessedRoutes)
      })
    }
  }
})

function filterAsyncRoutes(routes, roles) {
  return routes.filter(route => {
    if (route.meta && route.meta.roles) {
      return roles.some(role => route.meta.roles.includes(role))
    } else {
      return true
    }
  })
}

动态菜单渲染

根据生成的路由表渲染侧边栏菜单:

<template>
  <div v-for="route in permission_routes" :key="route.path">
    <router-link :to="route.path">{{ route.meta.title }}</router-link>
  </div>
</template>

<script>
import { mapGetters } from 'vuex'
export default {
  computed: {
    ...mapGetters(['permission_routes'])
  }
}
</script>

处理404页面

动态路由添加后,需将404页面路由放在最后:

const router = new VueRouter({
  routes: constantRoutes
})

// 添加动态路由后
router.addRoutes([
  ...accessedRoutes,
  { path: '*', redirect: '/404', hidden: true }
])

注意事项

  1. 路由的 name 属性必须唯一,否则可能导致路由添加失败
  2. Vue Router 3.x 使用 addRoutes,4.x 使用 addRoute 逐个添加
  3. 刷新页面时需要重新获取用户权限信息
  4. 后端返回的路由数据通常需要转换为组件引用(如 component: () => import('@/views/...')

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

相关文章

vue实现动态显示页面

vue实现动态显示页面

vue实现动态显示页面 在Vue中实现动态显示页面可以通过多种方式,包括条件渲染、动态组件、路由控制等。以下是几种常见的方法: 条件渲染v-if/v-show 使用v-if或v-show指令可以根据…

php 路由实现

php 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERV…

vue实现户籍系统路由实现

vue实现户籍系统路由实现

Vue 实现户籍系统路由方案 户籍系统通常涉及多层级页面和权限控制,以下是基于 Vue Router 的实现方案: 路由模块配置 在 src/router/index.js 中定义路由结构:…

vue路由实现iframe

vue路由实现iframe

Vue 路由实现 iframe 的方法 在 Vue 项目中,可以通过路由配置和组件的方式实现 iframe 的嵌入。以下是具体实现步骤: 创建 iframe 组件 新建一个 Vue 组件用于承载…

vue路由实现介绍

vue路由实现介绍

Vue 路由基础概念 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。它通过动态映射 URL 到组件,实现无刷新页面切换。核心功能包括: 嵌套路由:支持多…

Vue实现路由监

Vue实现路由监

Vue 实现路由监听的方法 在 Vue 中可以通过多种方式实现路由监听,以下是常见的几种方法: 使用 watch 监听 $route 对象 通过 Vue 的 watch 功能可以监听 $route…