路由封装

使用场景

当我们在使用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文件  import.meta.glob('./*/index.js', { eager: true })
const ModulesFile = import.meta.glob('./*/index.js', { eager: true })

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

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



RouterList.push({
    path: '/', // 路径
    name: 'Home',
    component: Home  // 组件
})


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

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

src/routers/user/index.js

// 引入当前目录下面的所有文件
const ModulesFile = import.meta.glob('./*.js', { eager: true })

// 路由集合
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
    }
]

Vite配置

vite.config.js

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
//引入路径模块
import path from 'path'
// https://vitejs.dev/config/
export default defineConfig({
  resolve: {
    alias: {
      "@": path.resolve(__dirname, "src"),
      'vue': 'vue/dist/vue.esm-bundler.js' // 定义vue的别名,如果使用其他的插件,可能会用到别名
    },
  },
  plugins: [vue()],
})
powered by GitbookEdit Time: 2024-06-06 18:25:41