Layout 布局
提供页头、侧边栏、内容区和页脚组合,适合搭建后台系统页面框架。
何时使用
- 页面需要稳定组织 Header、Sidebar、Content、Footer 等区域。
- 后台系统需要侧边导航和主内容区联动。
- 侧边栏需要支持折叠、响应式收起或拖拽调整宽度。
基础用法
vue
<template>
<x-layout class="demo-layout">
<x-layout-header>Header</x-layout-header>
<x-layout has-sidebar>
<x-layout-sidebar :width="120">Sidebar</x-layout-sidebar>
<x-layout-content>Content</x-layout-content>
</x-layout>
<x-layout-footer>Footer</x-layout-footer>
</x-layout>
</template>常见结构
vue
<template>
<x-layout class="layout-doc-demo">
<x-layout-header>Header</x-layout-header>
<x-layout-content>Content</x-layout-content>
<x-layout-footer>Footer</x-layout-footer>
</x-layout>
<x-layout class="layout-doc-demo">
<x-layout-header>Header</x-layout-header>
<x-layout has-sidebar>
<x-layout-sidebar :width="128">Left</x-layout-sidebar>
<x-layout-content>Content</x-layout-content>
<x-layout-sidebar :width="128" reverse-arrow>Right</x-layout-sidebar>
</x-layout>
<x-layout-footer>Footer</x-layout-footer>
</x-layout>
</template>可折叠侧边栏
vue
<template>
<x-layout class="layout-doc-demo" has-sidebar>
<x-layout-sidebar
v-model:collapsed="collapsed"
collapsible
theme="dark"
:width="180"
:collapsed-width="56"
>
{{ collapsed ? '已收起' : '已展开' }}
</x-layout-sidebar>
<x-layout-content>Content</x-layout-content>
</x-layout>
<x-space>
<x-button @click="collapsed = false">展开</x-button>
<x-button @click="collapsed = true">收起</x-button>
</x-space>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const collapsed = ref(false);
</script>自定义触发器
vue
<template>
<x-layout class="layout-doc-demo" has-sidebar>
<x-layout-sidebar
v-model:collapsed="collapsed"
collapsible
:width="180"
:collapsed-width="64"
>
{{ collapsed ? 'Mini' : 'Custom Trigger' }}
<template #trigger="{ collapsed: slotCollapsed }">
{{ slotCollapsed ? '展开' : '收起' }}
</template>
</x-layout-sidebar>
<x-layout-content>Content</x-layout-content>
</x-layout>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const collapsed = ref(false);
</script>响应式与事件
当前:展开
vue
<template>
<x-layout class="layout-doc-demo" has-sidebar>
<x-layout-sidebar
v-model:collapsed="collapsed"
collapsible
breakpoint="lg"
:width="190"
:collapsed-width="72"
@collapse="handleCollapse"
@breakpoint="handleBreakpoint"
>
{{ collapsed ? 'lg' : 'breakpoint="lg"' }}
</x-layout-sidebar>
<x-layout-content>Content</x-layout-content>
</x-layout>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const collapsed = ref(false);
const handleCollapse = (nextCollapsed: boolean, type: 'clickTrigger' | 'responsive') => {
console.log(nextCollapsed, type);
};
const handleBreakpoint = (nextCollapsed: boolean) => {
console.log(nextCollapsed);
};
</script>可拖拽侧边栏
vue
<template>
<x-layout class="layout-doc-demo" has-sidebar>
<x-layout-sidebar
:width="sidebarWidth"
:min-width="160"
:max-width="520"
:resize-directions="['right']"
@moving="(size) => {
sidebarWidth = size.width;
}"
>
拖动右侧边缘
</x-layout-sidebar>
<x-layout-content>当前宽度:{{ sidebarWidth }}px</x-layout-content>
</x-layout>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const sidebarWidth = ref(240);
</script>与 Menu 组合
vue
<template>
<x-layout class="layout-doc-demo" has-sidebar>
<x-layout-sidebar collapsible theme="dark" :width="210" :collapsed-width="64">
<x-menu v-model:selected-keys="selectedKeys" theme="dark">
<x-menu-item key="overview">概览</x-menu-item>
<x-menu-sub-menu key="workspace" title="工作台">
<x-menu-item key="components">组件</x-menu-item>
<x-menu-item key="docs">文档</x-menu-item>
</x-menu-sub-menu>
</x-menu>
</x-layout-sidebar>
<x-layout-content>Content</x-layout-content>
</x-layout>
</template>
<script setup lang="ts">
import { ref } from 'vue';
const selectedKeys = ref(['overview']);
</script>已知限制
collapsedWidth可以设为0,但当前不会生成侧边栏外部的零宽特殊触发器;需要重新展开时请提供外部按钮或自定义布局。resizeDirections会让 Sidebar 复用 ResizeBox 作为根组件,拖拽事件请参考 ResizeBox 文档。
按需导入
ts
import { Layout, LayoutHeader, LayoutContent, LayoutFooter, LayoutSidebar } from 'x-next';Layout Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
hasSidebar | 是否包含侧边栏,SSR 场景可用于避免样式闪动 | boolean | false |
LayoutSidebar Props
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
theme | 侧边栏主题 | 'dark' | 'light' | 'light' |
collapsed | 当前收起状态,可配合 v-model:collapsed 使用 | boolean | undefined |
defaultCollapsed | 默认收起状态,非受控用法 | boolean | false |
collapsible | 是否可收起 | boolean | false |
width | 展开宽度 | number | string | 200 |
collapsedWidth | 收起宽度 | number | 48 |
reverseArrow | 是否反转折叠箭头方向,右侧侧边栏可使用 | boolean | false |
breakpoint | 响应式断点 | 'xxl' | 'xl' | 'lg' | 'md' | 'sm' | 'xs' | - |
resizeDirections | 使用 ResizeBox 作为根组件后允许拖拽的方向 | Array<'left' | 'right' | 'top' | 'bottom'> | - |
hideTrigger | 是否隐藏折叠触发器 | boolean | false |
LayoutSidebar Events
| 事件名 | 说明 | 回调参数 |
|---|---|---|
update:collapsed | 收起状态变化时触发 | collapsed: boolean |
collapse | 展开/收起时触发 | collapsed: boolean, type: 'clickTrigger' | 'responsive' |
breakpoint | 响应式断点触发时触发 | collapsed: boolean |
Slots
| 组件 | 插槽名 | 说明 | 参数 |
|---|---|---|---|
Layout | default | 布局内容 | - |
LayoutHeader | default | 页头内容 | - |
LayoutContent | default | 内容区 | - |
LayoutFooter | default | 页脚内容 | - |
LayoutSidebar | default | 侧边栏内容 | - |
LayoutSidebar | trigger | 自定义折叠触发器 | { collapsed } |
Methods
当前组件没有通过 expose 暴露方法。