Skip to content

Commit aff312b

Browse files
kagolgitee-org
authored andcommitted
!266 feat(drawer): 增加基本组件的弹出方向属性和点击任意位置关闭
Merge pull request !266 from nif/drawer
2 parents 6c45a02 + e120907 commit aff312b

File tree

6 files changed

+26
-19
lines changed

6 files changed

+26
-19
lines changed

devui/drawer/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export { Drawer }
1010
export default {
1111
title: 'Drawer 抽屉板',
1212
category: '反馈',
13-
status: '10%',
13+
status: '30%',
1414
install(app: App): void {
1515

1616
app.use(Drawer as any)

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: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
position: absolute;
1515
top: 0;
1616
bottom: 0;
17+
width: 100vw;
1718
}
1819

1920
.devui-overlay-backdrop {
@@ -25,22 +26,18 @@
2526
height: 100vh;
2627
}
2728

28-
.devui-drawer-nav,
29-
.devui-drawer-content {
29+
.devui-drawer-nav {
3030
position: absolute;
3131
top: 0;
3232
bottom: 0;
3333
border-radius: $devui-border-radius;
34-
}
35-
36-
.devui-drawer-nav {
3734
background: $devui-base-bg;
3835
}
3936

4037
.devui-drawer-content {
41-
left: 0;
42-
right: 0;
38+
border-radius: $devui-border-radius;
4339
overflow: auto;
4440
box-shadow: $devui-shadow-length-fullscreen-overlay $devui-shadow;
4541
padding: 20px;
42+
height: 100vh;
4643
}

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 navRight = computed(() => position.value === 'right' ? { 'right': 0 } : {'left' : 0} );
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+
navRight,
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 navRight: Record<string, unknown> = this.navRight;
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">
71+
<div class="devui-drawer-nav" style={{ 'width': this.navWidth, ...navRight}}>
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: 2 additions & 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
/>
@@ -71,3 +72,4 @@ export default ({
7172
| onClose | `Function` | -- | 可选,关闭 drawer 时候调用 | [基本用法](#基本用法) |
7273
| escKeyCloseable | `Boolean` | `true` | 可选,设置可否通过 esc 按键来关闭 drawer 层 | [基本用法](#基本用法) |
7374
| afterOpened | `Function` | -- | 可选,打开 drawer 后时候调用 | [基本用法](#基本用法) |
75+
| position | `String` | 'right' | 可选,抽屉板出现的位置,'left'或者'right' | [基本用法](#基本用法) |

0 commit comments

Comments
 (0)