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测试 (仅用于说明函数调用方法)

无头部/底部

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

无头部抽屉

无头部无底部抽屉

仅关闭按钮的抽屉

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();