vue中另一种路由写法

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

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/>

原文地址:https://www.cnblogs.com/ToBeBest/p/11392793.html

时间: 2024-11-08 15:47:12

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

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

Vue中使用children实现路由的嵌套 相关Html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv=&

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

前言:为什么要不通过路由直接获取url中的参数? vue中使用路由的方式设置url参数,但是这种方式必须要在路径中附带参数,而且这个参数是需要在vue的路由中提前设置好的. 相对来说,在某些情况下直接在url后面拼接?mid=100的方式传递参数更灵活,你不需要设置路由,只需要在url后拼接参数即可,但是这种方式就需要通过javascript获取并提取url中的参数,通过传统的方式直接在页面中获取是行不通的了,因为vue中是无法通过location.search()来获取url问号之后的内容的.

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

1.路由传值   this.$router.push() (1) 想要导航到不同的URL,使用router.push()方法,这个方法会向history栈添加一个新纪录,所以,当用户点击浏览器后退按钮时,会回到之前的URL (2)当点击 <router-link> 时,这个方法会在内部调用,即点击 <router-link :to="..."> 等同于调用 router.push(...) a)      声明式:<router-link :to=&quo

nodejs项目中的路由写法

1 //两种路由写法,一种封装成函数,返回结果,此种方法可以传递参数, 2 "use strict"; 3 var _ = require("lodash"); 4 var express = require('express'); 5 var router = express.Router(); 6 var thenjs = require('thenjs'); 7 8 module.exports = function(utils) { 9 10 //* 广告

vue中template的三种写法

第一种(使用模板字符串)早期字符串拼接年代 <div id="app"></div> new Vue({ el: "#app", template: '<div> <h1>{{message}}</h1> <div>', data: { message: '字符串拼接' } }) 第二种(使用script元素)HTML5标准之前的写法 <div id="app">

横冲直撞vue(第三篇):vue中template的三种写法、v-bind、v-on、更新元素的指令v-text与v-html、条件渲染指令v-if 与v-show、v-for

一.vue中template的三种写法 第一种(字符串模板写法): 直接写在vue构造器里,这种写法比较直观,适用于html代码不多的场景,但是如果模板里html代码太多,不便于维护,不建议这么写. <body> <div id="app"></div> <script src="./lib/vue.js"></script> <script type="text/javascript&qu

vue中路由按需加载的几种方式

使用vue-cli构建项目后,我们会在Router文件夹下面的index.js里面引入相关的路由组件,如: import Hello from '@/components/Hello' import Boy from '@/components/Boy' import Girl from '@/components/Girl' 普通加载的缺点: webpack在打包的时候会把整个路由打包成一个js文件,如果页面一多,会导致这个文件非常大,加载缓慢 1.require.ensure()实现按需加载

vue 中的路由为什么 采用 hash 路由模式,而不是href超链接模式(Hypertext,Reference)?

1. vue中路由模式的种类有两种 1. 一种是 hash 模式. 2. 一种是 h5 的 history 模式. 2. hash 和 history 都是来自 bom 对象 bom 来自 window 3. window.location.hash 4. hash 是属于 window.location 这个对象,而history直接属于 window 5. window.history 6. 是因为路由模式下,当hash值发生改变,不会发生网络请求,但是href会,vue会自动监听hash

C++面试中string类的一种正确写法

C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源.具体来说: 能像 int 类型那样定义变量,并且支持赋值.复制. 能用作函数的参数类型及返回类型. 能用作标准库容器的元素类型,即 vector/list/deque 的 value_type.(用作 std::map 的 key_type 是更进一步的要求,本文从略). 换言之,你的 String 能让以下代码编译运行通过,并且没有内存方面的错误. vo