vue动态路由学习

本文分享了在Vue项目中实现动态路由的过程,详细介绍了如何根据角色信息动态加载路由,包括从后端获取数据、利用Vuex状态管理和前端路径重组的技术细节。

学习vue也有一段时间了,这段时间也遇到了不少问题,趁着有时间来复习总结一下。
动态路由在vue中的使用时非常常见的,就是根据不同的角色信息从数据库中获得不同的数据库导入路由表,实现权限控制以及动态菜单显示等效果。
步骤如下:

  1. 在导航守卫处判断是否已加载路由
  2. 未加载则读取后端数据,同时存入vuex状态
  3. 已加载则继续下个界面的跳转

首先就是后端的读取,读取数据如下:
我开始本来是准备直接读入后端数组添加进行路由表,但是报异常了,component不可为string,修改一遍后,
在登录成功跳转的时候却报错了,显示的是 can not find module ‘xxx’,特别奇怪,因为从模块名xxx可知,它名称的读取是成功的,但是似乎并不能成功的解析这个模块,后来网上查了很久也没解决,偶然看见了别人读取component时对解析地址进行了多一步的修改。
就是使用for循环拆开各个路径再在前端重新拼起来,结果一试发现居然成功了。

// 挂载路由导航守卫
router.beforeEach((to, from, next) => {
  addDynamicMenuAndRoutes()
  next()
})
function addDynamicMenuAndRoutes() {
  
  var roleid = null
  if(store.state.user.user){
    roleid =  store.state.user.user.role.id
  }
  var request = {roleid:roleid}
  api.menu.getRoutersByRoleid(request)
  .then( (res) => {
    var dynamicRoutes = addDynamicRoutes(res.data)
    router.options.routes = router.options.routes.concat(dynamicRoutes)
    router.addRoutes(router.options.routes)
  })
  .catch(function(res) {
    alert(res);
  });
}
function addDynamicRoutes (menuList=[]) {
  var routes1 = []
  // 第一层
  for(var i = 0;i < menuList.length;i++){
    let array = menuList[i].path.split('/')
    let url = ''
          for(let i = 0;i<array.length;i++){
            if(i == 0){
              continue
            }
            if(i==(array.length-1)){
              url = url + '/' + array[i].substring(0,1).toUpperCase()+array[i].substring(1)
            }else{
              url = url + '/'+ array[i]
            }
          }      
    var router1 = {
      path: menuList[i].path,
      component: resolve => require([`@/views${url}`], resolve),
      name: menuList[i].name,
      redirect: menuList[i].children[0].path,
      children:[]
    }
    
    if(menuList[i].children){
      
      var routes2 = []
      // 第二层
      for(var j = 0;j<menuList[i].children.length;j++){
        let array = menuList[i].children[j].path.split('/')
    let url =''
          for(let i = 0;i<array.length;i++){
            if(i == 0){
              continue
            }
            if(i==(array.length-1)){
              url = url + '/' + array[i].substring(0,1).toUpperCase()+array[i].substring(1)
            }else{
              url = url + '/'+ array[i]
            }
          }  
        //const component1 = menuList[i].children[j].component
        var router2 = {
          path: menuList[i].children[j].path,
          component: resolve => require([`@/views${url}`], resolve),
          name: menuList[i].children[j].name
        }
        routes2.push(router2)
      }
      router1.children = routes2
    }
    routes1.push(router1)
  }
  return routes1
}

这个地方的疑问我也没搞清楚,感觉应该是前后端数据格式上是有差异的,不能直接解析(但是感觉不应该)。

### Vue 2 路由使用指南 Vue 2 的路由功能通过 `vue-router` 库实现,它可以帮助开发者快速构建单页应用(SPA)。以下是 Vue 2 路由的配置和使用方法的详细指南。 #### 安装 Vue Router 在开始使用 Vue Router 之,需要安装它。可以通过 `npm` 或 `yarn` 安装: ```bash npm install vue-router --save ``` 或者 ```bash yarn add vue-router@3.6.5 ``` 安装完成后,需要在 `main.js` 文件中引入并注册 Vue Router: ```javascript import Vue from 'vue' import VueRouter from 'vue-router' Vue.use(VueRouter) ``` #### 创建路由配置 接下来,需要创建一个路由配置文件。通常,这个文件会被放在 `src/router/index.js` 中。在这个文件中,定义路由规则并创建路由实例: ```javascript import Vue from 'vue' import Router from 'vue-router' import Home from '@/components/Home' import Content from '@/components/Content' import About from '@/components/About' import Submit from '@/components/Submit' Vue.use(Router) export default new Router({ routes: [ { path: '/', name: 'Home', component: Home }, { path: '/content', name: 'Content', component: Content }, { path: '/about', name: 'About', component: About }, { path: '/submit', name: 'Submit', component: Submit } ], mode: 'history' // 干掉地址栏里的 # 号 }) ``` #### 挂载路由实例 在 `main.js` 文件中,将创建的路由实例挂载到 Vue 应用中: ```javascript import Vue from 'vue' import App from './App.vue' import router from './router' new Vue({ router, render: h => h(App) }).$mount('#app') ``` #### 使用路由Vue 组件中,可以使用 `<router-link>` 组件进行路由跳转,并使用 `<router-view>` 组件来显示匹配的组件内容: ```html <template> <div> <router-link to="/home">Go to Home</router-link> <router-link to="/about">Go to About</router-link> <router-view></router-view> </div> </template> ``` #### 嵌套路由 Vue Router 还支持嵌套路由,可以在父路由下定义子路由。例如,定义 `/home` 路由下的子路由 `/home/xxx`: ```javascript const router = new VueRouter({ routes: [ { path: '/home', component: Home, children: [ { path: 'xxx', component: Xxx }, { path: 'yyy', component: Yyy } ] } ] }) ``` #### 通配符路由 为了处理 404 页面,可以使用通配符 `*` 来捕获所有未匹配的路由: ```javascript const routes = [ { path: '/foo', component: Foo }, { path: '/bar', component: Bar }, { path: '*', redirect: '/home' } // 默认跳转路由 ] ``` 需要注意的是,通配符路由应该放在路由配置的最后,因为 Vue Router 会按照定义顺序进行匹配。 #### 动态路由匹配 Vue Router 还支持动态路由匹配,例如匹配以 `/user-` 开头的任意路径: ```javascript const routes = [ { path: '/user-*', component: User } ] ``` #### 路由级 当同一个路径可以匹配多个路由时,匹配的优级按照路由的定义顺序:谁定义的,谁的优级就最高。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值