一个项目中一级菜单是固定的,二级及其以下的菜单是动态的,直接根据文件夹结构写路由

import Vue from 'vue'
import Router from 'vue-router'
import Lockr from 'lockr'
import { LoadingBar } from 'iview'
import { getToken } from '@/libs/util'
import config from '@/conf/conf' Vue.use(Router)
const getRouterChildren = (filenames, type) => {
let routesArr = []
filenames.map((obj) => {
let url = obj.replace(/^\.\//, `${type}/`).replace(/\.(vue)$/, '')
let path = url.replace(/\/(list)$/, '')
let arr = path.split('/')
let fullName = arr.map((item, index) => index === 0 ? item : item.charAt(0).toUpperCase() + item.slice(1)).join('')
if (arr.length > 1) {
routesArr.push({
path: '/' + path,
name: fullName,
key: arr[1],
props: true,
component: resolve => require([`@/views/${url}.vue`], resolve)
})
}
})
console.log('array', type !== 'app' ? routesArr : groupBy(routesArr, 'key'))
return type !== 'app' ? routesArr : groupBy(routesArr, 'key')
}
const groupBy = (array, name) => {
const groups = {}
array.forEach(function (o) {
const group = JSON.stringify(o[name])
groups[group] = groups[group] || []
groups[group].push(o)
})
return Object.keys(groups).map(function (group) {
let node = {...groups[group][0]}
node.children = groups[group].slice(1)
return node
})
}
const routes = [
{
path: '/',
name: 'index',
component: resolve => require(['@/views/common/index.vue'], resolve),
meta: { unlimited: true }
},
{
path: '/login',
name: 'login',
component: resolve => require(['@/views/common/login.vue'], resolve),
meta: { unlimited: true }
},
{
path: '/pay',
name: 'pay',
component: resolve => require(['@/views/common/pay.vue'], resolve)
},
{
path: '/home',
name: 'home',
redirect: { name: 'myList' },
component: resolve => require(['@/views/common/home.vue'], resolve),
children: [
    {
      path: '/*',
      redirect: {name: '404'}
    }, {
      path: '/test',
      name: 'test',
      redirect: {name: 'testOne'},
      component: resolve => require(['@/views/test/list.vue'], resolve),
      children: getRouterChildren(require.context('@/views/test', true, /\.vue$/).keys(), 'test')
    }, {
      path: '/app',
      name: 'app',
      component: resolve => require(['@/views/app/list.vue'], resolve),
      children: getRouterChildren(require.context('@/views/app', true, /\.vue$/).keys(), 'app')
    }
  ]
 }, {
    path: '*',
    redirect: { name: '404' }
  }
]
const router = new Router({
mode: config.MODE
routes: routes
}) const LOGIN_PAGE_NAME = 'login'
const HOME_PAGE_NAME = 'home'
router.beforeEach((to, from, next) => {
LoadingBar.start()
const token = getToken()
console.log('tag', to)
if (to.name !== 'sso') {
if (!token) {
Lockr.flush()
    to.name === LOGIN_PAGE_NAME ? next({name: HOME_PAGE_NAME}) : next()
} else {
next()
}
}) router.afterEach((to, from) => {
LoadingBar.finish()
window.scrollTo(0, 0)
}) export default router

app的路径如图,test的路径是直接去掉app这个中间层

访问路径的时候APP中的是/app/test/one,和app同级的test的路径是/test/one或着/test.

如果app是空页面的话app的一级页面直接这么写就可以了

如果test是空页面的话也要根据情况加上<router-view/>

vue中另一种路由写法的更多相关文章

  1. Vue中使用children实现路由的嵌套

    Vue中使用children实现路由的嵌套 相关Html: <!DOCTYPE html> <html lang="en"> <head> &l ...

  2. js中的三种函数写法

    js中的三种函数写法 <script type="text/javascript"> //普通的声明方式 function myFun(m,n){ alert(m+n) ...

  3. Vue中的三种Watcher

    Vue中的三种Watcher Vue可以说存在三种watcher,第一种是在定义data函数时定义数据的render watcher:第二种是computed watcher,是computed函数在 ...

  4. vue中如何不通过路由直接获取url中的参数

    前言:为什么要不通过路由直接获取url中的参数? vue中使用路由的方式设置url参数,但是这种方式必须要在路径中附带参数,而且这个参数是需要在vue的路由中提前设置好的. 相对来说,在某些情况下直接 ...

  5. Vue中的8种组件通信方式

    Vue是数据驱动视图更新的框架,所以对于vue来说组件间的数据通信非常重要. 常见使用场景可以分为三类: 父子组件通信: props / $emit $parent / $children provi ...

  6. vue中this.$router.push()路由传值和获取的两种常见方法

    1.路由传值   this.$router.push() (1) 路由跳转使用router.push()方法,这个方法会向history栈添加一个新纪录,所以,当用户点击浏览器后退按钮时,会回到之前的 ...

  7. 064——VUE中vue-router之使用路由别名定制(alias)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Vue中的组件及路由使用

    1.组件是什么        组件系统是 Vue 的一个重要概念,因为它是一种抽象,允许我们使用小型.独立和通常可复用的组件构建大型应用.通常一个应用会以一棵嵌套的组件树的形式来组织: 1.1组件的声 ...

  9. 【Vue中的坑】路由相同参数不同无法触发路由

    场景: vue实现导航栏,二级导航栏跳转到相同页面,通过参数来实现到该页面后,根据参数来滚动到对应到位置 网上的解决方法: 通常情况下我们喜欢设置keepAlive 包裹 router-view &l ...

随机推荐

  1. Redis集群到集群迁移

    目录 一.物理导入 简介 实际操作 一.物理导入 简介 redis集群在存储数据时,是根据槽点进行存储.例如老集群A如下: 都在一台机器,实际可以在多台机器上. 主节点:7000(0-5460) 70 ...

  2. Log4j漏洞源码分析

    Log4j漏洞源码分析 这几天Log4j的问题消息满天飞,今天我们就一起来看看从源码角度看看这个漏洞是如何产生的. 大家都知道这次问题主要是由于Log4j中提供的jndi的功能. 具体涉及到的入口类是 ...

  3. Vlookup大叔早已油腻(Excel函数集团)

    1.Vlookup基础用法:https://mp.weixin.qq.com/s/0JRytWlBD-KYM2jkecG2rA 2.合并字符串:https://mp.weixin.qq.com/s/9 ...

  4. Java abstract 抽象类 和interface接口的异同点

    abstract 抽象类 和interface接口的异同点 相同点: 抽象类和接口都不能实例化,他们都位于继承树顶端,被其他类实现和继承 都可以包含抽象方法,实现接口或者继承抽象类的非抽象类(普通类) ...

  5. Tornado 异步浅解

    7.1 认识异步 1. 同步 我们用两个函数来模拟两个客户端请求,并依次进行处理: #!/usr/bin/env python3 # -*- coding:utf-8 -*- # @Time: 202 ...

  6. JAVA使用WebSocket显示实时在线浏览人数

    有时候我们需要在内容详情页实时浏览人数,这时候我们可以使用websocket实现这个功能 pom.xml <dependency> <groupId>javax</gro ...

  7. 【LeetCode】997. Find the Town Judge 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 度 日期 题目地址:https://leetcode ...

  8. 【LeetCode】700. Search in a Binary Search Tree 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcod ...

  9. Pikachu漏洞练习-SQL-inject(四)

  10. 【转】GitHub 的 Pull Request 和 GitLab 的 Merge Request 有区别吗?

    在 GitHub 上混久了,经常听到 Pull Request,在 GitLab 上混久了,则经常 提起 Merge Request ,然而它们之间有不同吗?为什么要用两个不同的名称? 要追溯这两个名 ...