15 混合布局开发(下) - udo-bit/naive_admin_pro GitHub Wiki
完成侧边栏布局
由于我们的侧边栏的布局颜色是白色,但是我们的背景也是白色,所以开发起来会不太方便,接下来我们先调整一下整个布局的颜色。
在assets目录下创建一个styles的文件用于存放我们的样式信息。 然后再styles中创建一个index.css文件作为样式的入口。 我们在定义一个vars.css用于存放我们的css-var的全局变量。 我们在var.css中来写公共变量如下:
html{
--pro-admin-layout-content-bg: #f0f2f5;
}
在index.css中导出
@import "vars.css";
在main.ts导入
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
import '@unocss/reset/tailwind.css'
+ import '~/assets/styles/index.css'
import 'uno.css'
import router from '~/routes'
// console.log(import.meta.env.VITE_APP_BASE)
const pinia = createPinia()
const meta = document.createElement('meta')
meta.name = 'naive-ui-style'
document.head.appendChild(meta)
const app = createApp(App)
app.use(router)
app.use(pinia)
app.mount('#app')
在mix-layout/index.vue中,改造内容布局
<n-layout-content content-style="padding: 24px;" style="--n-color: var(--pro-admin-layout-content-bg)">
<slot />
</n-layout-content>
后续我们增加其他布局的时候,我们也会用到n-layout-content所以我们不能每次都处理,我们处理一次后直接封装成一个组件,方便我们后续的使用。 我们在common目录下创建一个layout-content.vue的文件。
<script lang="ts" setup>
const attrs = useAttrs()
</script>
<template>
<n-layout-content v-bind="attrs" style="--n-color: var(--pro-admin-layout-content-bg)">
<slot />
</n-layout-content>
</template>
我们在common目录下增加一个index.ts文件,然后我们从index.ts中将我们组件进行导出,方便我们后续扩展组件引用。
import Title from './title.vue'
import Logo from './logo.vue'
import LayoutContent from './layout-content.vue'
export {
Title,
Logo,
LayoutContent,
}
然后在mix-layout/index.vue中调整组件导入: 将
import Logo from '~/layouts/common/logo.vue'
import Title from '~/layouts/common/title.vue'
改为:
import { Logo,LayoutContent,Title } from '~/layouts/common'
然后我们将下面的n-layout-content替换成LayoutContent即可
我们的侧边栏本身也会在多种布局中使用,所以我们也需要将它封装到我们的layouts的公共组件中。 在common中创建一个layout-sider.vue的文件。
<script lang="ts" setup>
const attrs = useAttrs()
</script>
<template>
<n-layout-sider v-bind="attrs">
<slot />
</n-layout-sider>
</template>
替换mix-layout/index.vue中的n-layout-sider为LayoutSider
接下来我们需要在全局配置一下默认情况下我们的侧边栏的宽度,以及收起的情况下我们侧边栏的宽度。 在config/layout-theme.ts中:
import logo from '~/assets/vue.svg'
export interface LayoutTheme {
title?: string
layout: 'mix' | 'side' | 'top'
headerHeight: number
logo?: string
siderWidth: number // 侧边栏宽度
siderCollapsedWidth: number // 侧边栏收起的宽度
showSiderTrigger: boolean | 'bar' | 'arrow-circle' // 侧边栏默认的触发方式
}
export const layoutThemeConfig: LayoutTheme = {
title: 'Naive Admin Pro',
layout: 'mix',
headerHeight: 48,
logo,
siderWidth: 240,
siderCollapsedWidth: 48,
showSiderTrigger: 'bar',
}
在mix-layout中定义属性接收
const props = withDefaults(defineProps<{
headerHeight?: number
logo?: string
title?: string
siderWidth?: number
siderCollapsedWidth?: number
showSiderTrigger?: boolean | 'bar' | 'arrow-circle'
}>(), {
headerHeight: 48,
siderWidth: 240,
siderCollapsedWidth: 48,
})
然后传给我们的LayoutSider�组件。
<LayoutSider
:collapsed-width="siderCollapsedWidth"
:width="siderWidth"
:show-trigger="showSiderTrigger"
content-style="padding: 24px;"
>
海淀桥
</LayoutSider>
最后我们在base-layout中配置查看效果:
<MixLayout
v-if="layout.layout === 'mix'"
:logo="layout.logo"
:title="layout.title"
:show-sider-trigger="layout.showSiderTrigger"
:sider-width="layout.siderWidth"
:sider-collapsed-width="layout.siderCollapsedWidth"
>
<template #headerRight>
<div>
测试右侧插槽
</div>
</template>
<router-view />
</MixLayout>
最后我们发现,侧边栏收起默认情况下,没有改变实际的宽度,只是移动了它的位置,这不是我们想要的效果,所以我们在layout-sider.vue中更改collapse-mode属性为width,后测试效果,文字不会被收起看不到了。