Skip to content

Drawer 抽屉 ​

抽屉组件用于从屏幕边缘滑出的面板,用于展示额外的内容或操作。

基础用法 ​

通过模板中直接使用 Drawer 组件,并通过 v-model:open 控制其显示状态,是推荐的默认使用方式。

不同位置 ​

抽屉支持从四个方向打开:左、右、上、下。通过 position 属性控制。

不同尺寸 ​

抽屉支持多种尺寸:sm、md、lg、fullscreen。通过 size 属性控制。

自定义按钮 ​

通过 footer 属性可以自定义抽屉的底部按钮。

异步关闭 ​

通过 onOk 事件可以实现异步关闭抽屉。

动画控制 ​

通过 animated 属性可以控制抽屉是否启用弹出动画。

动画控制说明

通过 animated 属性可以控制抽屉是否启用弹出动画。

默认情况下,animated 属性为 true,启用动画效果。 设置为 false 时,抽屉将直接显示和隐藏,没有过渡动画。

遮罩控制 ​

通过 mask 属性可以控制是否显示遮罩层,通过 maskStyle 属性可以自定义遮罩层的样式。

Drawer 遮罩测试

测试1: mask=false

测试2: mask=true (默认)

测试3: 自定义遮罩样式

函数式API测试 (仅用于说明函数调用方法)

无头部/底部 ​

通过 header 和 footer 属性可以完全隐藏抽屉的头部和底部区域。

无头部抽屉

无头部无底部抽屉

仅关闭按钮的抽屉

Props ​

属性名类型默认值说明
openbooleanundefined是否打开抽屉
defaultOpenbooleanfalse默认是否打开抽屉
titlestring''抽屉标题
contentstring | HTMLElement | (() => HTMLElement)undefined抽屉内容
sizestring'md'抽屉尺寸,可选值:'sm', 'md', 'lg', 'fullscreen'
positionstring'right'抽屉位置,可选值:'left', 'right', 'top', 'bottom'
closablebooleantrue是否显示关闭按钮
headerbooleantrue是否显示头部区域,设置为false时将完全隐藏头部
maskbooleantrue是否显示遮罩层
maskStyleRecord<string, string | number>{}自定义遮罩样式
maskClosablebooleantrue点击遮罩层是否可以关闭抽屉
escClosablebooleantrue按ESC键是否可以关闭抽屉
footerboolean | HTMLElement | (() => HTMLElement)true抽屉底部,false表示不显示底部,true表示显示默认底部,HTMLElement或函数表示自定义底部
widthstring | numberundefined抽屉宽度,支持数字(px)和字符串形式的CSS值
heightstring | numberundefined抽屉高度,支持数字(px)和字符串形式的CSS值
animatedbooleantrue是否启用动画
transitionDurationnumber300抽屉动画时长(ms)
maskTransitionDurationnumber200遮罩层动画时长(ms)
zIndexnumberundefined抽屉的z-index值

Events ​

事件名说明回调参数
open抽屉打开时触发(value: boolean)
close抽屉关闭时触发(value: boolean)
ok点击确定按钮时触发-
cancel点击取消按钮或关闭抽屉时触发-

Slots ​

插槽名说明
default抽屉的默认内容
header抽屉的头部内容,优先级高于title属性
footer抽屉的底部内容,优先级高于footer属性

非函数式调用 ​

除了函数式API,也可以在模板中直接使用Drawer组件,通过v-model控制其显示状态,并使用插槽自定义内容。

vue
<template>
  <div>
    <button @click="drawerVisible = true">打开抽屉</button>

    <Drawer v-model:open="drawerVisible" title="非函数式抽屉">
      <template #header>
        <div class="custom-header">自定义头部内容</div>
      </template>

      <div class="drawer-content">这是使用非函数式调用的抽屉内容</div>

      <template #footer>
        <div class="custom-footer">
          <button @click="drawerVisible = false">取消</button>
          <button @click="handleOk">确定</button>
        </div>
      </template>
    </Drawer>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import Drawer from '@/components/Drawer';

const drawerVisible = ref(false);

const handleOk = () => {
  console.log('点击了确定按钮');
  drawerVisible.value = false;
};
</script>

<style scoped>
.custom-header {
  font-size: 18px;
  font-weight: bold;
  color: #333;
}

.drawer-content {
  padding: 20px 0;
}

.custom-footer {
  display: flex;
  gap: 10px;
  justify-content: flex-end;
}
</style>

函数式API ​

showDrawer(options) ​

通过函数式API可以方便地在任何地方打开抽屉。

参数 ​

参数名类型默认值说明
titlestring-抽屉标题
contentstring | HTMLElement | (() => HTMLElement)-抽屉内容
sizestring'md'抽屉尺寸,可选值:'sm', 'md', 'lg', 'fullscreen'
positionstring'right'抽屉位置,可选值:'left', 'right', 'top', 'bottom'
closablebooleantrue是否显示关闭按钮
maskbooleantrue是否显示遮罩层
maskStyleRecord<string, string | number>{}自定义遮罩样式
maskClosablebooleantrue点击遮罩层是否可以关闭抽屉
escClosablebooleantrue按ESC键是否可以关闭抽屉
footerboolean | HTMLElement | (() => HTMLElement)true抽屉底部,false表示不显示底部,true表示显示默认底部,HTMLElement或函数表示自定义底部
widthstring | numberundefined抽屉宽度,支持数字(px)和字符串形式的CSS值
heightstring | numberundefined抽屉高度,支持数字(px)和字符串形式的CSS值
animatedbooleantrue是否启用动画
onOk() => void-点击确定按钮时的回调函数
onCancel() => void-点击取消按钮时的回调函数
onClose() => void-抽屉关闭时的回调函数

返回值 ​

属性名类型说明
close() => void用于手动关闭抽屉的方法

示例 ​

javascript
import { showDrawer } from '@/components/Drawer';

// 打开抽屉
const drawer = showDrawer({
  title: '示例抽屉',
  content: '这是一个抽屉示例',
  onOk: () => {
    console.log('点击了确定按钮');
  },
  onCancel: () => {
    console.log('点击了取消按钮');
  },
});

// 打开无遮罩层抽屉
const noMaskDrawer = showDrawer({
  title: '无遮罩层抽屉',
  content: '这个抽屉没有显示遮罩层',
  mask: false,
  position: 'right',
});

// 打开自定义遮罩层抽屉
const customMaskDrawer = showDrawer({
  title: '自定义遮罩层抽屉',
  content: '这个抽屉有自定义样式的遮罩层,模糊背景效果',
  mask: true,
  maskStyle: {
    backgroundColor: 'rgba(255, 250, 255, 0.1)',
    backdropFilter: 'blur(15px)',
  },
  position: 'right',
});

// 手动关闭抽屉
// drawer.close();