Skip to content

Commit 060c0cd

Browse files
committed
feat(ui): support destroy node after element hided
1 parent 355c2d9 commit 060c0cd

File tree

8 files changed

+29
-1
lines changed

8 files changed

+29
-1
lines changed

packages/ui/src/components/_transition/Transition.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,24 @@ export interface DTransitionProps {
1111
dDuring: number | { enter: number; leave: number };
1212
dMountBeforeFirstEnter?: boolean;
1313
dSkipFirstTransition?: boolean | [boolean, boolean];
14+
dDestroyWhenLeaved?: boolean;
1415
onEnter?: () => void;
1516
afterEnter?: () => void;
1617
afterLeave?: () => void;
1718
}
1819

1920
export function DTransition(props: DTransitionProps): JSX.Element | null {
20-
const { children, dIn, dDuring, dMountBeforeFirstEnter = true, dSkipFirstTransition = true, onEnter, afterEnter, afterLeave } = props;
21+
const {
22+
children,
23+
dIn,
24+
dDuring,
25+
dMountBeforeFirstEnter = true,
26+
dSkipFirstTransition = true,
27+
dDestroyWhenLeaved = false,
28+
onEnter,
29+
afterEnter,
30+
afterLeave,
31+
} = props;
2132

2233
const initState = useMemo<DTransitionState>(() => {
2334
const [skipEnter, skipLeave] = isArray(dSkipFirstTransition) ? dSkipFirstTransition : [dSkipFirstTransition, dSkipFirstTransition];
@@ -101,6 +112,10 @@ export function DTransition(props: DTransitionProps): JSX.Element | null {
101112
}, [stateChange]);
102113

103114
const shouldRender = (() => {
115+
if (state === 'leaved' && dDestroyWhenLeaved) {
116+
return false;
117+
}
118+
104119
if (dataRef.current.isFirstEnter && !dMountBeforeFirstEnter) {
105120
return false;
106121
}

packages/ui/src/components/alert/Alert.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ export function DAlert(props: DAlertProps): JSX.Element | null {
6060
},
6161
leaved: { display: 'none' },
6262
}}
63+
dDestroyWhenLeaved
6364
afterEnter={() => {
6465
afterVisibleChange?.(true);
6566
}}

packages/ui/src/components/button/Button.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ function Button(props: DButtonProps, ref: React.ForwardedRef<HTMLButtonElement>)
106106
},
107107
leaved: { display: 'none' },
108108
}}
109+
dDestroyWhenLeaved
109110
>
110111
{(collapseRef, collapseStyle) => buttonIcon(true, collapseRef, collapseStyle)}
111112
</DCollapseTransition>

packages/ui/src/components/drawer/Drawer.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export interface DDrawerProps extends React.HTMLAttributes<HTMLDivElement> {
2929
dMaskClosable?: boolean;
3030
dEscClosable?: boolean;
3131
dSkipFirstTransition?: boolean;
32+
dDestroyAfterClose?: boolean;
3233
dHeader?: React.ReactElement | string;
3334
dFooter?: React.ReactElement;
3435
dChildDrawer?: React.ReactElement;
@@ -59,6 +60,7 @@ export const DDrawer: {
5960
dMaskClosable = true,
6061
dEscClosable = true,
6162
dSkipFirstTransition = true,
63+
dDestroyAfterClose = true,
6264
dHeader,
6365
dFooter,
6466
dChildDrawer,
@@ -232,6 +234,7 @@ export const DDrawer: {
232234
dIn={visible}
233235
dDuring={TTANSITION_DURING_BASE}
234236
dSkipFirstTransition={dSkipFirstTransition}
237+
dDestroyWhenLeaved={dDestroyAfterClose}
235238
afterEnter={() => {
236239
afterVisibleChange?.(true);
237240
}}

packages/ui/src/components/image/ImagePreview.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ export function DImagePreview(props: DImagePreviewProps): JSX.Element | null {
238238
<DTransition
239239
dIn={visible}
240240
dDuring={TTANSITION_DURING_BASE}
241+
dDestroyWhenLeaved
241242
afterEnter={() => {
242243
afterVisibleChange?.(true);
243244
}}

packages/ui/src/components/modal/Modal.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export interface DModalProps extends React.HTMLAttributes<HTMLDivElement> {
2626
dMaskClosable?: boolean;
2727
dEscClosable?: boolean;
2828
dSkipFirstTransition?: boolean;
29+
dDestroyAfterClose?: boolean;
2930
dType?: {
3031
type: 'success' | 'warning' | 'error' | 'info';
3132
title?: React.ReactNode;
@@ -54,6 +55,7 @@ export const DModal: {
5455
dMaskClosable = true,
5556
dEscClosable = true,
5657
dSkipFirstTransition = true,
58+
dDestroyAfterClose = true,
5759
dType,
5860
dHeader,
5961
dFooter,
@@ -137,6 +139,7 @@ export const DModal: {
137139
dIn={visible}
138140
dDuring={TTANSITION_DURING_BASE}
139141
dSkipFirstTransition={dSkipFirstTransition}
142+
dDestroyWhenLeaved={dDestroyAfterClose}
140143
onEnter={() => {
141144
if (isUndefined(ROOT_DATA.clickEvent) || performance.now() - ROOT_DATA.clickEvent.time > 100) {
142145
dataRef.current.transformOrigin = undefined;

packages/ui/src/components/popover/Popover.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export interface DPopoverProps extends Omit<React.HTMLAttributes<HTMLDivElement>
2929
dContainer?: DRefExtra | false;
3030
dPlacement?: DPopupPlacement;
3131
dEscClosable?: boolean;
32+
dDestroyAfterClose?: boolean;
3233
dArrow?: boolean;
3334
dModal?: boolean;
3435
dDistance?: number;
@@ -53,6 +54,7 @@ function Popover(props: DPopoverProps, ref: React.ForwardedRef<DPopoverRef>): JS
5354
dContainer,
5455
dPlacement = 'top',
5556
dEscClosable = true,
57+
dDestroyAfterClose = false,
5658
dArrow = true,
5759
dModal = false,
5860
dDistance = 10,
@@ -292,6 +294,7 @@ function Popover(props: DPopoverProps, ref: React.ForwardedRef<DPopoverRef>): JS
292294
<DTransition
293295
dIn={visible}
294296
dDuring={TTANSITION_DURING}
297+
dDestroyWhenLeaved={dDestroyAfterClose}
295298
onEnter={updatePosition}
296299
afterEnter={() => {
297300
afterVisibleChange?.(true);

packages/ui/src/components/spinner/Spinner.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ export function DSpinner(props: DSpinnerProps): JSX.Element | null {
9393
containerRef.current.style.height = `${spinnerRef.current.clientHeight}px`;
9494
}
9595
}}
96+
dDestroyWhenLeaved
9697
afterEnter={() => {
9798
afterVisibleChange?.(true);
9899
}}

0 commit comments

Comments
 (0)