Drawer 抽屉
从屏幕边缘滑出的模态面板
用法
基础
打开上层确认框后,Tab 留在确认框内,Escape 只关闭确认框。
示例加载中...
方向
direction 支持四个方向;左右时 size 是宽度,上下时是高度。
示例加载中...
尺寸与全屏
size 接受数字(px)、CSS 长度、百分比或 'full';full 等价于 size="full"。
示例加载中...
头尾插槽与遮罩
header、footer 插槽接收 close;maskEffect 设置遮罩效果,panelTransparent 让面板透出背部内容。
示例加载中...
表单
不需要 close 时,footer 插槽可以直接改写外部状态。
<template>
<TxDrawer v-model:visible="visible" title="表单">
<form>
<input type="text" placeholder="姓名" />
</form>
<template #footer>
<TxButton @click="visible = false">取消</TxButton>
<TxButton type="primary" @click="handleSave">保存</TxButton>
</template>
</TxDrawer>
</template>
关闭行为
<template>
<!-- 点击遮罩不关闭 -->
<TxDrawer v-model:visible="visible" title="持久化" :close-on-click-mask="false">
<p>只能通过关闭按钮关闭</p>
</TxDrawer>
<!-- Escape 不关闭 -->
<TxDrawer v-model:visible="visible2" title="禁用 Escape" :close-on-press-escape="false">
<p>Escape 键不会关闭此抽屉</p>
</TxDrawer>
</template>
开关事件
<template>
<TxDrawer v-model:visible="visible" title="事件示例" @open="handleOpen" @close="handleClose">
<p>内容</p>
</TxDrawer>
</template>
后台导航
Tabs 固定一级分区,DropdownMenu 承载轻量操作,Popover 放短说明,高密度配置放进 Drawer。
示例加载中...
最佳实践
- 长表单、审计明细、权限矩阵和需要 Footer 操作区的流程放进 Drawer,不要塞进 Popover。
- 即使
showHeader=false也提供有意义的title,它是对话框的无障碍名称。 - 用
size或full设置尺寸;width只为旧调用点保留。 - 只有在小屏上保持侧向进入比底部弹出更重要时,才设置
mobileAdapt=false。 - 焦点由抽屉管理,外层不要再手动抢焦点;正文的表单字段仍需明确的 label。
API 参考
属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| visible | 是否显示,配合 `v-model:visible` 使用。 | ||
| title | 标题;不渲染 Header 时作为 `aria-label`。 | ||
| size | 当前轴尺寸:左右为宽度,上下为高度;数字按 px,`full` 为 100%。 | ||
| full | 在当前方向全屏打开,等价于 `size="full"`。 | ||
| width | - | 旧版兼容项,改用 `size`。 | |
| direction | 滑出方向。 | ||
| showHeader | 渲染 Header 区域。 | ||
| showFooter | 渲染 Footer 插槽区域。 | ||
| showClose | 在默认 Header 中显示关闭按钮。 | ||
| closeOnClickMask | 点击遮罩时关闭。 | ||
| closeOnPressEscape | 按 Escape 时关闭。 | ||
| maskEffect | 遮罩效果:模糊、仅变暗或透明。 | ||
| panelTransparent | 面板半透明,透出背部内容。 | ||
| mobileAdapt | 视口宽度 ≤ 768px 时强制从底部弹出。 | ||
| zIndex | - | 固定层级;不传时由 z-index manager 从 `10000` 起分配。 | |
| lazy | 首次打开前不渲染插槽内容,之后一直保留;需要提前挂载时设为 `false`。 |
事件
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| update:visible | - | 可见性变化时触发。 | |
| open | - | `visible` 变为 `true` 时触发。 | |
| close | - | 用户关闭时触发;父级改写 `visible` 不触发。 |
插槽
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| default | - | - | 主内容。 |
| header | - | - | 替换默认标题与关闭按钮;slot props: `{ close, title, titleId }`。 |
| footer | - | - | 底部操作区;slot props: `{ close }`。 |
概述
- 根节点为
role="dialog"、aria-modal="true";渲染 Header 时用aria-labelledby关联标题,否则以title作为aria-label。 - 打开时聚焦抽屉,Tab 在抽屉内循环;关闭或卸载时焦点回到打开前的元素。
- 关闭按钮、遮罩与 Escape 都派发
update:visible(false)与close;closeOnClickMask、closeOnPressEscape分别关闭后两条路径。 - 只有最上层的模态对话框响应 Tab 与 Escape,已被其他控件处理的按键会被忽略,因此上层确认框独占这些按键。
- 关闭后根节点仍留在 DOM 中,并设置
inert与aria-hidden。
技术实现
- 头尾分隔线复用
TxDivider,不要再为它们硬编码边框。 - 源码:
packages/tuffex/packages/components/src/drawer/。
查看源码
packages/tuffex/packages/components/src/drawer/index.ts