ProLayout 高级布局
ProLayout 可以提供一个标准又不失灵活的中后台标准布局,同时提供一键切换布局形态、自动生成菜单等功能。与 PageContainer 配合使用可以自动生成面包屑、页面标题,并且提供低成本方案接入页脚工具栏。
基础用法
通过 menu-data 传入树形菜单(path / name / 可选 icon / children),用 layout 切换 side | top | mix;使用 v-model:active-path 与当前路由或业务状态同步;v-model:collapsed 控制侧栏折叠(top 布局下无侧栏,折叠无效)。
切换 side / top / mix;菜单项带图标;menu-active-color / menu-active-background 自定义选中样式(示例 #3992FF / #F7F8FA);headerContent 内根据 activePath 渲染面包屑(side 顶栏;mix / top 主内容区上方);可视化 → 数据大屏 演示 hideMenu;无 vue-router 时仅本地状态演示。
菜单项角标(menuItemBadge 插槽)
在 ProLayout 上使用具名插槽 #menuItemBadge,作用域参数为 { item }(当前 ProLayoutMenuItem)。插槽内容会渲染在菜单名右侧;侧栏为纵向且已折叠、且该项配置了 icon 时,同一插槽内容会出现在图标右上角(子菜单折叠标题行内仅保留角标区,避免与文案并排重复)。
一级「电子邮件」数字角标,二级菜单项红点(可分别开关),并折叠侧栏查看图标角标。
布局说明
| 取值 | 说明 |
|---|---|
side | 顶栏(Logo、标题、headerContent 插槽位于 Logo/标题 之后、actions 之前、右侧操作区)+ 左侧整树菜单(UScrollbar 包裹,菜单区可纵向滚动)+ 主内容;侧栏文案超出宽度 单行省略(…),悬停时 UTooltip 展示完整名称;侧栏底部为折叠按钮 |
top | 顶栏内横向整树菜单由 UScrollbar 包裹,项过多时 横向滚动;文案溢出省略时悬停 UTooltip 展示全名 + 主内容,无侧栏 |
mix | 顶栏一级横向菜单 UScrollbar(横向滚动 + 溢出 Tooltip);侧栏二级菜单 UScrollbar(纵向滚动 + 省略与 Tooltip);根据 active-path 解析当前一级节点;无子节点时不展示侧栏 |
菜单选中颜色
通过 menu-active-color(选中文字/图标色,对应 UMenu 的 active-text-color / --u-menu-active-color)与 menu-active-background(选中项与 hover/focus 下的背景色,如 #F7F8FA)统一三种布局下的侧栏与顶栏菜单高亮。未传时沿用主题默认。
菜单图标
菜单项 icon 为可选的 Vue 组件(推荐 @uniboot/icons-vue 图标),由布局在 UMenu / UMenuItem / USubMenu 中与文案一并渲染。不传 icon 时仅展示文字。
import { Folder, Setting } from '@uniboot/icons-vue'
import type { ProLayoutMenuItem } from 'uniboot-ui'
const menuData: ProLayoutMenuItem[] = [
{ path: '/a', name: '模块 A', icon: Folder },
{
path: '/b',
name: '模块 B',
icon: Setting,
children: [{ path: '/b/1', name: '子页' }],
},
]面包屑与 activePath
ProLayout 不负责内置面包屑。常见做法是:在 headerContent 插槽中放置 UBreadcrumb,根据 menuData 与 v-model:active-path 解析从根到当前节点的路径(与路由 matched 思路类似)。基础示例中的 findMenuBreadcrumb 即在树中按 path 精确匹配并返回祖先链,供面包屑 v-for 使用。
layout: 'side':headerContent渲染在 顶栏 内、紧跟 Logo /title,与右侧actions同一行。品牌区占位宽度与侧栏一致(扣除UPageHeader默认左右 16px 内边距),headerContent再增加与UMain相同的左内边距(默认 20px,与--upro-main-padding-x同步),使面包屑与主内容左缘 纵向对齐;长面包屑可在该行内收缩省略(min-width: 0)。layout: 'top'/mix:headerContent在 主内容区上方(顶栏与正文之间);mix下与顶栏横向一级菜单分离。
隐藏菜单(hideMenu)
菜单项可选 hideMenu: true。当 v-model:active-path 在菜单树中按 最长路径前缀 匹配到该项时,布局 不渲染任何 UMenu:
side:左侧整树菜单隐藏,顶栏UPageHeader(Logo、title、actions)仍显示。top:顶栏内横向菜单隐藏,UPageHeader其余区域仍显示。mix:顶栏一级横向菜单与侧栏二级菜单均隐藏,UPageHeader仍显示。
适用于大屏、全屏编辑等场景;需在页面内或路由层提供返回入口(基础示例主内容区提供「返回节点管理」按钮)。
与兄弟页对比:同一父级下 统计报表 未设置 hideMenu,菜单照常显示。完整交互见基础示例 可视化 分组。
import { Document, Grid, Map } from '@uniboot/icons-vue'
import type { ProLayoutMenuItem } from 'uniboot-ui'
const vizGroup: ProLayoutMenuItem = {
path: '/viz',
name: '可视化',
icon: Map,
children: [
{ path: '/viz/dashboard', name: '数据大屏', icon: Grid, hideMenu: true },
{ path: '/viz/reports', name: '统计报表', icon: Document },
],
}侧栏折叠按钮图标
侧栏底部折叠按钮支持两种状态各传入一个图标(均为 Vue 组件):
| Prop | 含义 | 默认(内置) |
|---|---|---|
siderCollapseIcon | 侧栏已展开时显示(点击后收拢侧栏) | Fold |
siderExpandIcon | 侧栏已折叠时显示(点击后展开侧栏) | Expand |
<pro-layout
:menu-data="menuData"
:sider-collapse-icon="Fold"
:sider-expand-icon="Expand"
/>样式类 upro-layout__collapse-menu-icon 仍用于控制按钮内图标尺寸与颜色,无需业务侧覆盖即可与侧栏风格一致。
插槽
| 名称 | 说明 |
|---|---|
| default | 主内容区(UMain 内) |
| logo | 自定义 Logo 区域;未使用插槽时可配合 logo 属性传入图片 URL |
| headerContent | side:顶栏内、Logo / 标题之后、actions 之前(同一行)。top / mix:主内容区上方工具条(顶栏菜单与正文之间) |
| actions | 顶栏右侧操作区(用户信息、通知等) |
| footer | 传入时渲染页面底部 UFooter |
| menuItemBadge | 菜单项附加内容;作用域 { item: ProLayoutMenuItem }。未传入时不渲染角标区域 |
ProLayout API
ProLayout 属性
| 名称 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| menuData | 菜单树,必填 | array | — |
| layout | 布局形态 | enum | side |
| title | 站点标题 | string | '' |
| logo | Logo 图片 URL;也可用 logo 插槽完全自定义 | string | '' |
| siderWidth | 侧栏展开宽度 | string | 200px |
| collapsedWidth | 侧栏折叠宽度 | string | 64px |
| headerHeight | 顶栏区域最小高度 | string | 60px |
| siderCollapseIcon | 侧栏展开时,底部按钮图标(点击收拢) | Component | Fold |
| siderExpandIcon | 侧栏折叠时,底部按钮图标(点击展开) | Component | Expand |
| menuActiveColor | 菜单选中项文字/图标颜色(如 #3992FF) | string | '' |
| menuActiveBackground | 菜单选中项与 hover 背景色(如 #F7F8FA) | string | '' |
ProLayout 双向绑定
| 名称 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| collapsed | 侧栏是否折叠(v-model:collapsed) | boolean | false |
| activePath | 当前激活路径,与菜单高亮一致(v-model:active-path) | string | '' |
ProLayout 事件
| 名称 | 说明 | 类型 |
|---|---|---|
| menuSelect | 菜单选中 | Function |
ProLayout 暴露
| 名称 | 说明 | 类型 |
|---|---|---|
| toggleCollapsed | 切换折叠 | Function |
菜单项 ProLayoutMenuItem
| 名称 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| path | 唯一路径,作为菜单 index | string | — |
| name | 展示文案 | string | — |
| icon | 菜单图标(Vue 组件,可选) | Component | — |
| children | 子菜单 | array | — |
| hideMenu | 为 true 且当前路径匹配该项时隐藏全部 UMenu(侧栏与顶栏横向菜单),保留 UPageHeader | boolean | — |
开发与联调
源码位于 packages/components 仓库的 pro-layout;安装依赖需能解析 uniboot-ui、@uniboot/icons-vue 与 registry 配置(见 开发指南)。