一个常见的需求是,同模块的若干页面需要使用同一种布局,比如俱乐部相关的页面的顶部需要展示俱乐部的名称,其他页面顶部需要展示网站名称。
通常实现的方法是,将俱乐部的名称和网站名称定义成公共组件,在每个页面都书写置顶的布局,并引入响应的公共组件。
显然这是非常低效的,通过全局布局 vite-plugin-vue-layouts 可以帮你解决这个麻烦!
友情提示:
vite-plugin-vue-layouts 通常是配合 unplugin-vue-router 一起使用的!
使用流程
1. 安装 vite-plugin-vue-layouts
npm i -D vite-plugin-vue-layouts
2. vite 配置中导入
vite.config.ts
import Layouts from 'vite-plugin-vue-layouts'
plugins 中添加 Layouts
plugins: [
// VueRouter 必须在 vue() 之前
VueRouter({}),
Layouts({
layoutsDirs: 'src/layouts', // 指定布局文件的目录路径
defaultLayout: 'default' // 指定默认布局文件的名称
}),
vue(),
vueJsx(),
vueDevTools()
],
3. 添加类型声明
env.d.ts
/// <reference types="vite-plugin-vue-layouts/client" />
4. 改造路由配置
- 引入 setupLayouts
- 用 setupLayouts() 包裹原路由
src/router/index.ts 的最终效果如下:
import { createRouter, createWebHistory } from 'vue-router'
import { routes } from 'vue-router/auto-routes'
import { setupLayouts } from 'virtual:generated-layouts'
const router = createRouter({
history: createWebHistory(),
routes: setupLayouts([
...routes,
// 自定义配置路由 /test ,访问文件 src/views/test.vue
{
path: '/test',
component: () => import('@/views/test.vue')
}
])
})
export default router
5. 创建布局模板
新建文件 src/layouts/default.vue
<template>
<div>网站标题</div>
<router-view></router-view>
</template>
新建文件 src/layouts/ECclub.vue
<template>
<div>EC编程俱乐部</div>
<router-view></router-view>
</template>
6. 页面中指定布局模板
src/pages/about.vue
<template>
<div>关于EC俱乐部</div>
</template>
<route lang="yaml">
meta:
layout: ECclub
</route>
- 在目标页面底部参考上方范例新增 route 标签
- layout 的值设定为目标布局模板名称即可!
因在配置中,指定了默认布局模板为 default,所以所有未指定布局模板的页面,都会使用 src/layouts/default.vue 中的布局。
最终效果如下:
- 路由
/
网站标题
首页
- 路由
/about
EC编程俱乐部
关于EC俱乐部
更多配置和用法见官网
https://www.npmjs.com/package/vite-plugin-vue-layouts