From dd095d0bc89069b28b1925a0be35ccb511bb8a90 Mon Sep 17 00:00:00 2001 From: AiYiNing <1914420862@qq.com> Date: Fri, 15 Jan 2021 20:08:46 +0800 Subject: [PATCH 1/2] fix: destyOnClose fails with forceRender --- src/DialogWrap.tsx | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/DialogWrap.tsx b/src/DialogWrap.tsx index ed787b20..276d5e3b 100644 --- a/src/DialogWrap.tsx +++ b/src/DialogWrap.tsx @@ -14,14 +14,22 @@ import { IDialogPropTypes } from './IDialogPropTypes'; const DialogWrap: React.FC = (props: IDialogPropTypes) => { const { visible, getContainer, forceRender, destroyOnClose = false, afterClose } = props; + const [forceRenderTime, setForceRenderTime] = React.useState(forceRender); const [animatedVisible, setAnimatedVisible] = React.useState(visible); React.useEffect(() => { if (visible) { setAnimatedVisible(true); + if (destroyOnClose) { + setForceRenderTime(false); + } } }, [visible]); + React.useEffect(() => { + setForceRenderTime(forceRender); + }, [forceRender]); + // 渲染在当前 dom 里; if (getContainer === false) { return ( @@ -33,15 +41,16 @@ const DialogWrap: React.FC = (props: IDialogPropTypes) => { } // Destroy on close will remove wrapped div - if (!forceRender && destroyOnClose && !animatedVisible) { + if (!forceRenderTime && destroyOnClose && !animatedVisible) { return null; } return ( - + {(childProps: IDialogChildProps) => ( { afterClose?.(); From 8f7c6308221a315e07c4ccef939b2065ec90aaae Mon Sep 17 00:00:00 2001 From: AiYiNing <1914420862@qq.com> Date: Fri, 15 Jan 2021 20:08:57 +0800 Subject: [PATCH 2/2] test --- tests/index.spec.tsx | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/index.spec.tsx b/tests/index.spec.tsx index 099d0091..861bc04c 100644 --- a/tests/index.spec.tsx +++ b/tests/index.spec.tsx @@ -113,6 +113,29 @@ describe('dialog', () => { }); }); + it('destroy component when forceRender is true', () => { + const wrapper = mount( + +
forceRender destroyOnClose
+
, + ); + + expect(wrapper.find('.rc-dialog-body > div').text()).toEqual('forceRender destroyOnClose'); + + // Hide + wrapper.setProps({ visible: true }); + jest.runAllTimers(); + wrapper.update(); + + // Show + wrapper.setProps({ visible: false }); + jest.runAllTimers(); + wrapper.update(); + + expect(wrapper.find('.rc-dialog-body > div')).toHaveLength(0); + wrapper.unmount(); + }); + it('esc to close', () => { const onClose = jest.fn(); const wrapper = mount();