Skip to content

抽屉 Drawer

就像是从窗口边缘弹出的 Dialog。

当有大量内容需要用弹窗展示时,使用这个组件或许会比 Dialog 拥有更好的视觉效果。Drawer 组件采用了和 Dialog 相似的 API 设计。

基础使用

visible 控制 Drawer 的展示和隐藏,传入 visible 进入受控模式。不传或者为 undefined 则为非受控模式,此时可以传入 defaultVisible 属性作为默认值。

隐藏源代码

底部内容

show-footer 控制是否展示底部区域,默认 false。开启 show-footer 后,可以通过 footer 插槽传入底部区域内容。

隐藏源代码

弹出位置

placement 属性设置弹出位置。

隐藏源代码

样式设置

就像栗子🌰所展示的那样,你可以直接传入 classstyle 等 attrs 穿透到抽屉容器元素上。

隐藏源代码

函数式

如果你完整注册了组件库,你可以以以下方式函数式地使用 Drawer:

  • window.$drawer
  • Vue 组件内: getCurrentInstance().appContext.config.globalProperties.PixeliumVue.drawer
  • @pixelium/web-vue 中导入。

按需引入时,也可以从 @pixelium/web-vue/es 中导入 Drawer 使用。

隐藏源代码

API

Drawer Function

ts
export type DrawerReturn = {
	close: () => void
}

// ...
// Drawer
{
	open: (
		options: (DrawerOptions & Omit<EmitEvent<DrawerEvents>, 'update:visible'>) | string
	) => DrawerReturn
}

Attrs

就像上面栗子所展示的那样🌰,作为组件时你可以直接传入 classstyle 等 attrs 穿透到 Drawer 容器元素上。

DrawerOptions

属性类型可选默认值描述版本
contentValidContentDrawer 的主体内容。0.2.0
titleValidContentDrawer 标题。0.2.0
footerValidContentDrawer 底部区域。0.2.0
placement'right' | 'left' | 'top' | 'down''right'Drawer 弹出位置。0.2.0
closablebooleantrue是否展示右上角关闭按钮。0.2.0
maskbooleantrue是否展示遮罩层。0.2.0
maskClosablebooleantrue点击遮罩层是否可以关闭 Drawer。0.2.0
escToClosebooleantrue是否可以按 ESC 键关闭 Drawer。0.2.0
showFooterbooleanfalse是否展示 Drawer 底部区域。0.2.0
zIndexnumberDrawer 的 z-index 属性。0.2.0
rootstring | HTMLElement'body'Drawer 挂载的根元素。0.2.0
maskPropsOmit<MaskProps, 'zIndex'>遮罩层的属性。0.2.0
containerPropsRestAttrsDrawer 容器元素的属性。0.2.0
headerPropsRestAttrsDrawer 头部区域元素的属性。0.2.0
bodyPropsRestAttrsDrawer 内容区域元素的属性。0.2.0
footerPropsRestAttrsDrawer 底部区域元素的属性。0.2.0

DrawerProps

属性类型可选默认值描述版本
visibleboolean | null控制 Drawer 展示,受控模式,支持 v-model0.2.0
defaultVisibleboolean | null控制 Drawer 展示的默认值,非受控模式。0.2.0
titlestring''Drawer 的标题。0.2.0
placement'right' | 'left' | 'top' | 'down''right'0.2.0
closablebooleantrue是否展示右上角关闭按钮。0.2.0
maskbooleantrue是否展示遮罩层。0.2.0
maskClosablebooleantrue点击遮罩层是否可以关闭 Drawer。0.2.0
escToClosebooleantrue是否可以按 ESC 键关闭 Drawer。0.2.0
showFooterbooleanfalse是否展示 Drawer 底部区域。0.2.0
rootstring | HTMLElement'body'Drawer 挂载的根元素。0.2.0
zIndexnumberDrawer 的 z-index 属性。0.2.0
destroyOnHidebooleanfalseDrawer 内容是否在隐藏后销毁。0.2.0
maskPropsOmit<MaskProps, 'zIndex'>遮罩层的属性。0.2.0
containerPropsRestAttrsDrawer 容器元素的属性。0.2.0
headerPropsRestAttrsDrawer 头部区域元素的属性。0.2.0
bodyPropsRestAttrsDrawer 内容区域元素的属性。0.2.0
footerPropsRestAttrsDrawer 底部区域元素的属性。0.2.0

DrawerSlots

插槽参数描述版本
defaultDrawer 的主体内容。0.2.0
titleDrawer 的标题。0.2.0
footerDrawer 底部区域。0.2.0

DrawerEvents

事件参数描述版本
update:visible用于更新受控模式的 visible 值。0.2.0
exitevent: MouseEvent | KeyboardEvent0.2.0
openDrawer 打开时的回调。0.2.0
afterOpenDrawer 打开动画结束后的回调。0.2.0
closeDrawer 关闭时的回调。0.2.0
afterCloseDrawer 关闭动画结束后的回调。0.2.0

DrawerExpose

属性类型可选默认值描述版本
close() => void关闭 Drawer。0.2.0
open() => void打开 Drawer。0.2.0

ValidContent, ValidVNodeContent

ts
export type ValidContent = string | ((...args: any[]) => VNode | string | JSX.Element | null | void)
export type ValidVNodeContent = (...args: any[]) => VNode | JSX.Element

RestAttrs

ts
import type { StyleValue } from 'vue'

export type VueClassValue = string | Record<string, any> | VueClassValue[]
export type VueStyleValue = StyleValue

export type RestAttrs = {
	style?: VueStyleValue | null
	class?: VueClassValue | null
	[x: string]: any
}

EmitEvent

ts
export type EmitEvent<T extends Record<string, any>> = {
	[K in keyof T as `on${Capitalize<K & string>}`]?: (...args: T[K]) => void
}