Skip to content

Commit 2a39713

Browse files
committed
feat(drawer): 增加基本组件的弹出方向属性和点击任意位置关闭
1 parent bbca389 commit 2a39713

File tree

5 files changed

+23
-12
lines changed

5 files changed

+23
-12
lines changed

devui/drawer/src/components/drawer-header.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { defineComponent, toRefs, ref, reactive } from 'vue'
1+
import { defineComponent, ref } from 'vue'
22
import { drawerHeaderType, DrawerHeaderType } from './drawer-header-type';
33

44
import './drawer-header.scss'
@@ -10,7 +10,8 @@ export default defineComponent({
1010
setup(props: DrawerHeaderType, ctx) {
1111
const isFullScreen = ref<boolean>(false);
1212

13-
const handleFullScreen = () => {
13+
const handleFullScreen = (e) => {
14+
e.stopPropagation();
1415
isFullScreen.value = !isFullScreen.value;
1516
ctx.emit('toggleFullScreen');
1617
}

devui/drawer/src/drawer-types.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { ExtractPropTypes } from 'vue'
1+
import type { ExtractPropTypes, PropType } from 'vue'
22

33
export const drawerProps = {
44
width: {
@@ -21,6 +21,10 @@ export const drawerProps = {
2121
type: Boolean,
2222
default: true,
2323
},
24+
position: {
25+
type: String as PropType<'left' | 'right'>,
26+
default: 'left',
27+
},
2428
} as const
2529

2630
export type DrawerProps = ExtractPropTypes<typeof drawerProps>

devui/drawer/src/drawer.scss

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
top: 0;
66
left: 0;
77
height: 100vh;
8+
width: 100vw;
89
}
910

1011
.devui-overlay-wrapper {
@@ -17,7 +18,7 @@
1718
}
1819

1920
.devui-overlay-backdrop {
20-
position: absolute;
21+
position: fixed;
2122
top: 0;
2223
left: 0;
2324
background: $devui-shadow;
@@ -30,6 +31,7 @@
3031
position: absolute;
3132
top: 0;
3233
bottom: 0;
34+
left: 0;
3335
border-radius: $devui-border-radius;
3436
}
3537

devui/drawer/src/drawer.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { defineComponent, ref, toRefs, watch } from 'vue'
1+
import { defineComponent, ref, toRefs, watch, computed } from 'vue'
22
import { drawerProps, DrawerProps } from './drawer-types'
33

44
import DrawerHeader from './components/drawer-header'
@@ -11,9 +11,12 @@ export default defineComponent({
1111
props: drawerProps,
1212
emits: ['close', 'update:visible', 'afterOpened'],
1313
setup(props: DrawerProps, { emit, slots }) {
14-
const { width, visible, zIndex, isCover, escKeyCloseable } = toRefs(props); // 宽度
14+
const { width, visible, zIndex, isCover, escKeyCloseable, position } = toRefs(props); // 宽度
1515
const isFullScreen = ref(false);
1616

17+
const navWidth = computed(() => isFullScreen.value ? '100vw' : width.value );
18+
const wrapperRight = computed(() => position.value === 'right' ? { 'right': width.value } : {} );
19+
1720
const fullScreenEvent = () => {
1821
isFullScreen.value = !isFullScreen.value;
1922
}
@@ -43,29 +46,29 @@ export default defineComponent({
4346
return {
4447
zIndex,
4548
isFullScreen,
46-
width,
49+
navWidth,
4750
visible,
4851
slots,
4952
isCover,
53+
wrapperRight,
5054
fullScreenEvent,
5155
closeDrawer,
5256
};
5357
},
5458
render() {
5559
const zindex: number = this.zIndex;
56-
const width: number = this.isFullScreen ? '100vw' : this.width;
5760
const fullScreenEvent: any = this.fullScreenEvent;
5861
const closeDrawer: any = this.closeDrawer;
5962
const isCover: boolean = this.isCover;
63+
const wrapperRight: Record<string, unknown> = this.wrapperRight;
6064

6165
if (!this.visible) return;
6266

6367
return (
64-
<div class="devui-drawer" style={{ zIndex: zindex }}>
65-
{/* TODO : 有遮罩层时才能点击关闭 onClick={ closeDrawer }*/}
68+
<div class="devui-drawer" style={{ zIndex: zindex }} onClick={ closeDrawer }>
6669
{isCover ? <div class="devui-overlay-backdrop"/>: ''}
67-
<div class="devui-overlay-wrapper" >
68-
<div class="devui-drawer-nav" style={{ 'left': 0, 'width': width }}>
70+
<div class="devui-overlay-wrapper" style={ wrapperRight }>
71+
<div class="devui-drawer-nav" style={{ 'width': this.navWidth }}>
6972
<div class="devui-drawer-content">
7073
<DrawerHeader onToggleFullScreen={fullScreenEvent} onClose={closeDrawer} />
7174
<div> { this.slots.default ? this.slots.default() : <DrawerContainer/>} </div>

docs/components/drawer/index.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
<d-drawer
2121
v-model:visible="isDrawerShow"
2222
:width="drawerWidth"
23+
position="right"
2324
@close="drawerClose"
2425
@afterOpened="drawerAfterOpened"
2526
/>

0 commit comments

Comments
 (0)