diff --git a/packages/devui-vue/devui/drawer/src/components/drawer-body.tsx b/packages/devui-vue/devui/drawer/src/components/drawer-body.tsx index 00d64fee17f480050ef4229820b6373fe31ecdac..a52965f7c04c14fa6b14eb05a5a5d4abe1ff779c 100644 --- a/packages/devui-vue/devui/drawer/src/components/drawer-body.tsx +++ b/packages/devui-vue/devui/drawer/src/components/drawer-body.tsx @@ -1,4 +1,4 @@ -import { defineComponent, inject, computed, toRefs, onUnmounted } from 'vue' +import { defineComponent, inject, computed } from 'vue' import './drawer-body.scss' @@ -12,16 +12,21 @@ export default defineComponent({ const position: any = inject('position') const width: any = inject('width') const visible: boolean = inject('visible') + const backdropCloseable: any = inject('backdropCloseable') const navRight = computed(() => position.value === 'right' ? { 'right': 0 } : { 'left': 0 }) const navWidth = computed(() => isFullScreen.value ? '100vw' : width.value) - let clickContent = (e) => { + const clickContent = (e) => { e.stopPropagation() } + const handleDrawerClose = () => { + if (!backdropCloseable.value) return; + closeDrawer(); + } + return { - closeDrawer, zindex, slots, isCover, @@ -29,16 +34,19 @@ export default defineComponent({ navWidth, visible, clickContent, + handleDrawerClose, } }, render() { - const { zindex, closeDrawer, slots, isCover, navRight, navWidth, visible } = this + const { + zindex, slots, isCover, navRight, navWidth, visible, handleDrawerClose + } = this if (!visible) return null return ( -
+
{isCover ?
: null}
diff --git a/packages/devui-vue/devui/drawer/src/components/drawer-header.tsx b/packages/devui-vue/devui/drawer/src/components/drawer-header.tsx index 8db4bec7e95cf1c1dc50db7b833526fa26dbe1e1..7e3e3a05c083a71e31d834880b27b332529b8c06 100644 --- a/packages/devui-vue/devui/drawer/src/components/drawer-header.tsx +++ b/packages/devui-vue/devui/drawer/src/components/drawer-header.tsx @@ -1,4 +1,4 @@ -import { defineComponent, ref, inject, computed, onUnmounted } from 'vue' +import { defineComponent, ref, inject, computed } from 'vue' import './drawer-header.scss' diff --git a/packages/devui-vue/devui/drawer/src/drawer-types.ts b/packages/devui-vue/devui/drawer/src/drawer-types.ts index 9cdc51e6ef1c27fb98b5b2bfb5880f838e20ff44..207cf89ef5e9372b08ba1f6c51a3657c4c55b741 100644 --- a/packages/devui-vue/devui/drawer/src/drawer-types.ts +++ b/packages/devui-vue/devui/drawer/src/drawer-types.ts @@ -25,6 +25,13 @@ export const drawerProps = { type: String as PropType<'left' | 'right'>, default: 'left', }, + backdropCloseable: { + type: Boolean, + default: true, + }, + beforeHidden: { + type: [Promise, Function] as PropType | (() => boolean | Promise)>, + }, } as const export type DrawerProps = ExtractPropTypes diff --git a/packages/devui-vue/devui/drawer/src/drawer.tsx b/packages/devui-vue/devui/drawer/src/drawer.tsx index 3b2be3ff4b2d239fc84d274d84e8293d861f2fdf..c19346a901576a9f997bd4ac8680b11fa775875c 100644 --- a/packages/devui-vue/devui/drawer/src/drawer.tsx +++ b/packages/devui-vue/devui/drawer/src/drawer.tsx @@ -10,14 +10,26 @@ export default defineComponent({ props: drawerProps, emits: ['close', 'update:visible', 'afterOpened'], setup(props: DrawerProps, { emit, slots }) { - const { width, visible, zIndex, isCover, escKeyCloseable, position } = toRefs(props) // 宽度 - let isFullScreen = ref(false) + const { + width, visible, zIndex, isCover, escKeyCloseable, position, + backdropCloseable, + } = toRefs(props) + const isFullScreen = ref(false) const fullScreenEvent = () => { isFullScreen.value = !isFullScreen.value } - const closeDrawer = () => { + const closeDrawer = async () => { + const beforeHidden = props.beforeHidden; + let result = (typeof beforeHidden === 'function' ? beforeHidden(): beforeHidden) ?? true; + if (result instanceof Promise) { + console.log(result); + + result = await result; + } + if (result) return; + emit('update:visible', false) emit('close') } @@ -47,6 +59,7 @@ export default defineComponent({ provide('width', width) provide('visible', visible) provide('isFullScreen', isFullScreen) + provide('backdropCloseable', backdropCloseable) onUnmounted(() => { document.removeEventListener('keyup', escCloseDrawer) diff --git a/packages/devui-vue/docs/components/drawer/index.md b/packages/devui-vue/docs/components/drawer/index.md index 55e0bd5aebe3ae82a1ce528afceeff0db013c35f..e94b9f9a5a09d44ddd3b2b69d698d27825207e81 100644 --- a/packages/devui-vue/docs/components/drawer/index.md +++ b/packages/devui-vue/docs/components/drawer/index.md @@ -22,6 +22,8 @@ v-model:visible="isDrawerShow" :width="drawerWidth" :isCover="isCover" + :backdropCloseable="backdropCloseable" + :beforeHidden="beforeHidden" position="right" @close="drawerClose" @afterOpened="drawerAfterOpened" @@ -35,7 +37,8 @@ export default ({ let isDrawerShow = ref(false) let btnName = ref('close') let drawerWidth = ref('15vw') - let isCover = ref(true) + let isCover = ref(false) + let backdropCloseable = ref(true); const drawerShow = () => { isDrawerShow.value = true @@ -50,6 +53,12 @@ export default ({ console.log('open') } + const beforeHidden = () => { + return new Promise((resolve) => { + resolve(false); + }); + } + return { isDrawerShow, btnName, @@ -58,6 +67,8 @@ export default ({ drawerClose, drawerAfterOpened, isCover, + backdropCloseable, + beforeHidden, } } }) @@ -74,7 +85,9 @@ export default ({ | width | `String` | `300px` | 可选,设置抽屉板宽度 | [基本用法](#基本用法) | | zIndex | `Number` | `1000` | 可选,设置 drawer 的 z-index 值 | [基本用法](#基本用法) | | isCover | `Boolean` | `true` | 可选,是否有遮罩层 | [基本用法](#基本用法) | -| onClose | `Function` | -- | 可选,关闭 drawer 时候调用 | [基本用法](#基本用法) | | escKeyCloseable | `Boolean` | `true` | 可选,设置可否通过 esc 按键来关闭 drawer 层 | [基本用法](#基本用法) | -| afterOpened | `Function` | -- | 可选,打开 drawer 后时候调用 | [基本用法](#基本用法) | | position | `String` | 'right' | 可选,抽屉板出现的位置,'left'或者'right' | [基本用法](#基本用法) | +| backdropCloseable | `Boolean` | true | 可选,设置可否通过点击背景来关闭 drawer 层 | [基本用法](#基本用法) | +| beforeHidden | `Function \| Promise` | -- | 可选,关闭窗口之前的回调 | [基本用法](#基本用法) | +| onClose | `Function` | -- | 可选,关闭 drawer 时候调用 | [基本用法](#基本用法) | +| onAfterOpened | `Function` | -- | 可选,打开 drawer 后时候调用 | [基本用法](#基本用法) |