跳到主要内容

Drawer 抽屉

从屏幕边缘滑出的抽屉面板,常用于详情查看、表单填写等需要较大展示空间的场景。 与 Dialog 的差别:贴边展示、按方向滑动、面板尺寸作用于单边(宽或高)。

基础用法​

四个方向与自定义尺寸
import { useState } from 'react'
import { LhButton, LhDrawer } from '@lh-ui/react'

export default function Demo() {
const [open, setOpen] = useState(false)
return (
<>
<LhButton onClick={() => setOpen(true)}>打开抽屉</LhButton>
<LhDrawer title="抽屉标题" open={open} onClose={() => setOpen(false)}>
抽屉内容
</LhDrawer>
</>
)
}

Drawer Props​

属性说明类型可选值默认值
children主体内容ReactNode——
open是否显示(受控)boolean—false
title标题ReactNode——
direction滑出方向'right' | 'left' | 'top' | 'bottom'—'right'
size面板尺寸(数字 → px,字符串支持百分比)string | number—'30%'
showClose是否显示关闭按钮boolean—true
maskClosable点击遮罩是否关闭boolean—false
closeOnEsc按 Esc 是否关闭boolean—true
lockScroll是否锁定 body 滚动(锁定时同时圈住焦点)boolean—true
beforeClose关闭前拦截,调 done 才继续(done: () => void) => void——
zIndexz-index(不传走全局递增体系)number——
header头部内容(覆盖默认标题栏)ReactNode——
footer底部内容(按钮区)ReactNode——
themeVars组件级主题变量Record<string, string>——
sx快速布局属性(作用于面板)SxProps——

Drawer 事件​

事件说明回调签名Vue 对照
onClose关闭请求(遮罩 / Esc / 关闭按钮,经 beforeClose 拦截后触发)() => voidupdate:modelValue / close
onOpen打开时触发(DOM 挂载后、进入动画前)() => voidopen
onOpened打开动画结束() => voidopened
onCloseStart关闭请求被接受、开始离开动画() => void—
onClosed关闭动画结束、DOM 卸载后() => voidclosed

ref​

forwardRef<LhDrawerInstance>。LhDrawerInstance 暴露 close()(走 beforeClose 拦截)与 isOpen。

遮罩默认不可点穿

maskClosable 默认 false(core 的 canDrawerClose 默认拒绝遮罩点击),避免误触; plus 的 closeOnClickModal 默认 true,迁移时需显式声明。

焦点圈

仅在 lockScroll 打开时圈住焦点(shouldDrawerTrapFocus):抽屉常作为轻量面板, 不锁定滚动时保留背后表单的 Tab 序列。关闭时焦点归还。

尺寸方向

size 为数字时归一化为 px;左右方向作用于面板 width,上下方向作用于 height。

样式​

import '@lh-ui/react/style/drawer'