Skip to content

Commit 87198f2

Browse files
committed
chore: destroyOnClose
1 parent b6da4d9 commit 87198f2

File tree

6 files changed

+80
-124
lines changed

6 files changed

+80
-124
lines changed

docs/demo/forceRender.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
## Force Render
2+
3+
<code src="../examples/forceRender.tsx">

docs/demo/openRenderDom.md

Lines changed: 0 additions & 3 deletions
This file was deleted.

docs/examples/forceRender.tsx

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { Button } from 'antd';
2+
import * as React from 'react';
3+
4+
import Drawer from 'rc-drawer';
5+
6+
import 'antd/lib/button/style';
7+
import 'antd/lib/menu/style';
8+
import 'antd/lib/style';
9+
10+
import '../../assets/index.less';
11+
import './assets/index.less';
12+
import motionProps from './motion';
13+
14+
export default () => {
15+
const [open, setOpen] = React.useState(false);
16+
const [open2, setOpen2] = React.useState(false);
17+
18+
return (
19+
<div>
20+
<Drawer
21+
width="20vw"
22+
open={open}
23+
onClose={() => setOpen(false)}
24+
forceRender
25+
{...motionProps}
26+
>
27+
Hello World!
28+
</Drawer>
29+
<Drawer
30+
width="20vw"
31+
open={open2}
32+
onClose={() => setOpen2(false)}
33+
destroyOnClose
34+
placement='left'
35+
{...motionProps}
36+
>
37+
Hello World!
38+
</Drawer>
39+
<div
40+
style={{
41+
width: '100%',
42+
height: 667,
43+
background: '#fff000',
44+
color: '#fff',
45+
textAlign: 'center',
46+
lineHeight: '667px',
47+
}}
48+
>
49+
<Button onClick={() => setOpen(true)}>Force Render</Button>
50+
<Button onClick={() => setOpen2(true)}>Destroy On Close</Button>
51+
</div>
52+
</div>
53+
);
54+
};

docs/examples/openRenderDom.tsx

Lines changed: 0 additions & 108 deletions
This file was deleted.

src/Drawer.tsx

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,21 @@ import type { DrawerPopupProps } from './DrawerPopup';
66

77
export type Placement = 'left' | 'top' | 'right' | 'bottom';
88

9-
type LevelMove = number | [number, number];
10-
119
export interface DrawerProps extends Omit<DrawerPopupProps, 'prefixCls'> {
1210
prefixCls?: string;
1311

1412
width?: string | number;
1513
height?: string | number;
1614
open?: boolean;
17-
handler?: React.ReactElement | null | false;
1815
placement?: Placement;
19-
level?: null | string | string[];
20-
levelMove?:
21-
| LevelMove
22-
| ((e: { target: HTMLElement; open: boolean }) => LevelMove);
2316
duration?: string;
24-
ease?: string;
25-
showMask?: boolean;
26-
onChange?: (open?: boolean) => void;
27-
onHandleClick?: (e: React.MouseEvent | React.KeyboardEvent) => void;
2817
onClose?: (e: React.MouseEvent | React.KeyboardEvent) => void;
2918
keyboard?: boolean;
3019
contentWrapperStyle?: React.CSSProperties;
3120
autoFocus?: boolean;
3221
wrapperClassName?: string;
33-
forceRender?: boolean;
22+
destroyOnClose?: boolean;
23+
3424
getContainer?: GetContainer | false;
3525
}
3626

@@ -43,17 +33,34 @@ export default function Drawer(props: DrawerProps) {
4333
forceRender,
4434
wrapperClassName,
4535
prefixCls = 'rc-drawer',
36+
afterOpenChange,
37+
destroyOnClose,
4638
} = props;
4739

40+
const [animatedVisible, setAnimatedVisible] = React.useState(false);
41+
42+
// ============================= Open =============================
43+
const internalAfterOpenChange: DrawerProps['afterOpenChange'] =
44+
nextVisible => {
45+
setAnimatedVisible(nextVisible);
46+
afterOpenChange?.(nextVisible);
47+
};
48+
49+
// ============================ Render ============================
4850
const sharedDrawerProps = {
4951
...props,
5052
prefixCls,
53+
afterOpenChange: internalAfterOpenChange,
5154
};
5255

5356
if (getContainer === false) {
5457
return <DrawerPopup {...sharedDrawerProps} inline />;
5558
}
5659

60+
if (!forceRender && !animatedVisible && !open && destroyOnClose) {
61+
return null;
62+
}
63+
5764
return (
5865
<Portal
5966
visible={open}

src/DrawerPopup.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export interface DrawerPopupProps {
1515
placement?: Placement;
1616
inline?: boolean;
1717
push?: { distance?: number | string };
18+
forceRender?: boolean;
1819

1920
// MISC
2021
scrollLocker?: ScrollLocker;
@@ -48,9 +49,10 @@ export default function DrawerPopup(props: DrawerPopupProps) {
4849
const {
4950
prefixCls,
5051
open,
51-
placement = 'left',
52+
placement = 'right',
5253
inline,
5354
push,
55+
forceRender,
5456

5557
// MISC
5658
scrollLocker,
@@ -152,6 +154,7 @@ export default function DrawerPopup(props: DrawerPopupProps) {
152154
key="panel"
153155
{...motionProps}
154156
visible={open}
157+
forceRender={forceRender}
155158
onVisibleChanged={nextVisible => {
156159
afterOpenChange?.(nextVisible);
157160
if (!nextVisible) {

0 commit comments

Comments
 (0)