当前位置:首页 > VUE

vue实现登录动态路由

2026-01-20 06:09:53VUE

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

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

定义静态路由和动态路由

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

// 静态路由
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 管理路由状态和权限数据:

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页面路由放在最后:

vue实现登录动态路由

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 路由通常通过 vue-router 库实现,以下是具体实现步骤: 安装 vue-router 在项目中运行以下命令安装 vue-router: npm install…

vue实现动态换肤

vue实现动态换肤

Vue 动态换肤实现方法 动态换肤是前端开发中常见的需求,Vue 可以通过多种方式实现这一功能。以下是几种常见的实现方法: CSS 变量结合 Vuex 或 Pinia 定义全局 CSS 变量,通过…

vue路由如何实现

vue路由如何实现

vue路由的实现方法 Vue路由可以通过Vue Router库来实现。Vue Router是Vue.js官方的路由管理器,用于构建单页面应用(SPA)。 安装Vue Router 使用npm或yar…

vue如何实现路由

vue如何实现路由

路由基础配置 在Vue中实现路由通常使用Vue Router库。安装Vue Router后,在项目中创建路由配置文件(如router/index.js),定义路由路径与组件的映射关系: import…

vue实现动态查询

vue实现动态查询

Vue实现动态查询的方法 动态查询在Vue中通常结合输入框和列表渲染实现,核心是监听用户输入并实时过滤数据。以下是几种常见实现方式: 使用计算属性过滤数据 计算属性适合对已有数据进行过滤,依赖响应式…

vue 动态实现联动

vue 动态实现联动

Vue 动态实现联动的方法 数据绑定与监听 在Vue中实现联动效果的核心是利用v-model和watch。通过双向绑定表单元素的值,并在数据变化时触发监听函数更新关联数据。 data() { r…