路由封装

安装VueRouter4

npm install vue-router@4 -S

快速入门使用

//引入路由对象
import { createRouter, createWebHashHistory } from "vue-router"

//引入组件
import home from '../components/home.vue'
import user from '../components/user.vue'

//创建路由
export default createRouter({
    history: createWebHashHistory(), //路由的模式
    linkExactActiveClass: 'active',  //点击路由跳转的底部样式标量
    //路由列表
    routes: [
        {
            //默认首页
            path: '/',
            name: 'home',
            component: home
        },
        {
            path: '/user',
            name: 'user',
            component: user
        }
    ]
})

使用场景

当我们在使用vue-router来进行路由封装的时候,就会需要用到该功能点

在用vue-router的时候会遇到需要引入当前文件夹下的所有文件例如引入module文件夹下所有的js文件

通常可以再module文件夹下建一个index.js 文件,然后在index文件里统一 export导出

但其实可以更方便,import.meta.globEager这个ES6方法可以满足需求,不需要再每次都要在index文件里导出了

这样操作我们还有一个好处就是可以让路由封装的路径与Components组件目录的路径一致

我们先可以看一下目录结构

组件的目录结构

components/
    user/
        base/
            index.vue
            login.vue
            profile.vue
            register.vue

        address/
            index.vue
            add.vue
            edit.vue

路由的目录结构

routers/
    user/
        base.js
        address.js
        order.js
        index.js

    product/
        cart.js
        product.js
        type.js
        index.js

    index.js

由此可见我们发现每个目录下面都有一个index.js这个文件,那么这个文件就是每个路由模块的入口文件

总入口文件

src/routers/index.js

//引入路由对象
import { createRouter, createWebHashHistory } from "vue-router"

// 设置一个默认首页
import home from '@/components/home.vue'

// 引入每个目录下面的index.js文件
const ModulesFile = import.meta.globEager("./*/index.js")

// 总路由集合
const RouterList = []

//提取每个对象下的值 同步获取
Object.values(ModulesFile).map(async mod => {
  if(mod.default)
  {
    RouterList.push(...mod.default)
  }
})

RouterList.push({
  path:'/', //传参选项 query
  name:'home', //传参选项 params
  component: home,
  // meta:{ //自定义参数
  //   Auth:true, //自定义命名 比如Auth为true就是需要登录 否则不需要登录
  // }
})

// 创建一个总路由对象
export default createRouter({
  history: createWebHashHistory(),  //history模式 并且不会有/# 
  linkExactActiveClass:'active',  //激活链接状态class名称
  routes:RouterList,   //routes 很容易写成 routers !!!!!!!!!
})

每个独立路由模块下面的index.js

src/routers/user/index.js

// 引入当前目录下面的所有文件
const ModulesFile = import.meta.globEager('./*.js')

// 路由集合
const RouterList = []

//提取每个对象下的值 同步获取
Object.values(ModulesFile).map(async mod => {
  if(mod.default)
  {
    RouterList.push(...mod.default)
  }
})

//定义父组件
const layout = {
  template:`<router-view></router-view>`
}

//导出
export default [
  {
    path:'/user', // 父路由
    component:layout,
    //子路由分组   /user/order/xxxx
    children:RouterList
  }
]

其他的路由文件

src/routers/user/base.js

//引入组件
import index from '@/components/user/base/index.vue'
import login from '@/components/user/base/login.vue'
import register from '@/components/user/base/register.vue'
import profile from '@/components/user/base/profile.vue'

export default [
    //会员中心
    {
        // /user/base/index
        path:'base/index',
        name:'BaseIndex',
        component:index,
        meta:{ //如果路由中存在这个属性 就代表需要登录才能访问
            auth:true
        }
    },
    {
        //基本资料
        path:'base/profile',
        name:'BaseProfile',
        component:profile,
        meta:{
            auth:true
        }
    },
    {
        //登录界面
        path:'base/login',
        name:'BaseLogin',
        component:login
    },
    {
        //注册界面
        path:'base/register',
        name:'BaseRegister',
        component:register
    }
]
powered by GitbookEdit Time: 2023-04-08 10:28:32