Skip to content

Commit 2fc2a75

Browse files
committed
feat: support autoDestroy
1 parent d7b07ea commit 2fc2a75

File tree

2 files changed

+33
-3
lines changed

2 files changed

+33
-3
lines changed

src/Portal.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ export interface PortalProps {
2020
children?: React.ReactNode;
2121
/** Show the portal children */
2222
open?: boolean;
23+
/** Remove `children` when `open` is `false`. Set `false` will not handle remove process */
24+
autoDestroy?: boolean;
2325
/** Lock screen scroll when open */
2426
autoLock?: boolean;
2527

@@ -46,16 +48,25 @@ const getPortalContainer = (getContainer: GetContainer) => {
4648
};
4749

4850
export default function Portal(props: PortalProps) {
49-
const { open, autoLock, getContainer, debug, children } = props;
51+
const {
52+
open,
53+
autoLock,
54+
getContainer,
55+
debug,
56+
autoDestroy = true,
57+
children,
58+
} = props;
5059

5160
const [mergedRender, setMergedRender] = React.useState(open);
5261

5362
useScrollLocker(autoLock && open);
5463

5564
// ====================== Should Render ======================
5665
React.useEffect(() => {
57-
setMergedRender(open);
58-
}, [open]);
66+
if (autoDestroy || open) {
67+
setMergedRender(open);
68+
}
69+
}, [open, autoDestroy]);
5970

6071
// ======================== Container ========================
6172
const [innerContainer, setInnerContainer] = React.useState<

tests/index.test.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,23 @@ describe('Portal', () => {
127127
});
128128
});
129129
});
130+
131+
it('autoDestroy', () => {
132+
expect(document.querySelector('p')).toBeFalsy();
133+
134+
const renderDemo = (open: boolean, autoDestroy: boolean) => (
135+
<Portal open={open} autoDestroy={autoDestroy}>
136+
<p>Root</p>
137+
</Portal>
138+
);
139+
140+
const { rerender } = render(renderDemo(true, false));
141+
expect(document.querySelector('p')).toBeTruthy();
142+
143+
rerender(renderDemo(false, false));
144+
expect(document.querySelector('p')).toBeTruthy();
145+
146+
rerender(renderDemo(false, true));
147+
expect(document.querySelector('p')).toBeFalsy();
148+
});
130149
});

0 commit comments

Comments
 (0)