Skip to content

Commit c4e36e4

Browse files
authored
fix: Dialog should keep refresh when forceRender provided (#217)
* fix: Should re-render when forceRender * test: wrap test * test: Add test case
1 parent 716f1a8 commit c4e36e4

File tree

3 files changed

+44
-21
lines changed

3 files changed

+44
-21
lines changed

src/Dialog/Content/MemoChildren.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import * as React from 'react';
22

33
export interface MemoChildrenProps {
4-
visible: boolean;
4+
shouldUpdate: boolean;
55
children: React.ReactNode;
66
}
77

88
export default React.memo(
99
({ children }: MemoChildrenProps) => children as React.ReactElement,
10-
(_, { visible }) => !visible,
10+
(_, { shouldUpdate }) => !shouldUpdate,
1111
);

src/Dialog/Content/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ const Content = React.forwardRef<ContentRef, ContentProps>((props, ref) => {
151151
onMouseUp={onMouseUp}
152152
>
153153
<div tabIndex={0} ref={sentinelStartRef} style={sentinelStyle} aria-hidden="true" />
154-
<MemoChildren visible={visible}>
154+
<MemoChildren shouldUpdate={visible || forceRender}>
155155
{modalRender ? modalRender(content) : content}
156156
</MemoChildren>
157157
<div tabIndex={0} ref={sentinelEndRef} style={sentinelStyle} aria-hidden="true" />

tests/index.spec.tsx

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
/* eslint-disable react/no-render-return-value, max-classes-per-file, func-names, no-console */
22
import React, { cloneElement } from 'react';
33
import { act } from 'react-dom/test-utils';
4-
import { mount } from 'enzyme';
4+
import { mount, ReactWrapper } from 'enzyme';
55
import Portal from 'rc-util/lib/Portal';
66
import KeyCode from 'rc-util/lib/KeyCode';
7-
import Dialog from '../src';
7+
import Dialog, { DialogProps } from '../src';
88

99
describe('dialog', () => {
1010
beforeEach(() => {
@@ -250,7 +250,10 @@ describe('dialog', () => {
250250
});
251251

252252
expect(
253-
(wrapper.find('.rc-dialog').at(0).getDOMNode() as HTMLDivElement).style['transform-origin'],
253+
(wrapper
254+
.find('.rc-dialog')
255+
.at(0)
256+
.getDOMNode() as HTMLDivElement).style['transform-origin'],
254257
).toBeTruthy();
255258
});
256259

@@ -355,23 +358,43 @@ describe('dialog', () => {
355358
});
356359
});
357360

358-
it('should not re-render when visible changed', () => {
359-
let renderTimes = 0;
360-
const RenderChecker = () => {
361-
renderTimes += 1;
362-
return null;
363-
};
361+
describe('re-render', () => {
362+
function createWrapper(props?: Partial<DialogProps>): [ReactWrapper, () => number] {
363+
let renderTimes = 0;
364+
const RenderChecker = () => {
365+
renderTimes += 1;
366+
return null;
367+
};
364368

365-
const wrapper = mount(
366-
<Dialog visible>
367-
<RenderChecker />
368-
</Dialog>,
369-
);
369+
const Demo = (demoProps?: any) => {
370+
return (
371+
<Dialog visible {...props} {...demoProps}>
372+
<RenderChecker />
373+
</Dialog>
374+
);
375+
};
370376

371-
expect(renderTimes).toEqual(1);
377+
const wrapper = mount(<Demo />);
372378

373-
// Hidden should not trigger render
374-
wrapper.setProps({ visible: false });
375-
expect(renderTimes).toEqual(1);
379+
return [wrapper, () => renderTimes];
380+
}
381+
382+
it('should not re-render when visible changed', () => {
383+
const [wrapper, getRenderTimes] = createWrapper();
384+
expect(getRenderTimes()).toEqual(1);
385+
386+
// Hidden should not trigger render
387+
wrapper.setProps({ visible: false });
388+
expect(getRenderTimes()).toEqual(1);
389+
});
390+
391+
it('should re-render when forceRender', () => {
392+
const [wrapper, getRenderTimes] = createWrapper({ forceRender: true });
393+
expect(getRenderTimes()).toEqual(1);
394+
395+
// Hidden should not trigger render
396+
wrapper.setProps({ visible: false });
397+
expect(getRenderTimes()).toEqual(2);
398+
});
376399
});
377400
});

0 commit comments

Comments
 (0)