Skip to content

Commit 3493250

Browse files
authored
fix: preserve false should not trigger shouldUpdate rerender (#714)
* test: test driven * enhance: shouldUpdate false should not trigger rerender
1 parent 9a98132 commit 3493250

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

src/Field.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,10 @@ class Field extends React.Component<InternalFieldProps, FieldState> implements F
297297
* - Reset A, need clean B, C
298298
*/
299299
case 'remove': {
300-
if (shouldUpdate) {
300+
if (
301+
shouldUpdate &&
302+
requireUpdate(shouldUpdate, prevStore, store, prevValue, curValue, info)
303+
) {
301304
this.reRender();
302305
return;
303306
}

tests/dependencies.test.tsx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,4 +226,43 @@ describe('Form.Dependencies', () => {
226226
// sync end
227227
expect(spy).toHaveBeenCalledTimes(3);
228228
});
229+
230+
it('shouldUpdate false should not update', () => {
231+
let counter = 0;
232+
const formRef = React.createRef<FormInstance>();
233+
234+
const { container } = render(
235+
<Form ref={formRef}>
236+
<Field name="little" preserve={false}>
237+
<Input />
238+
</Field>
239+
240+
<Field shouldUpdate={(prev, next) => prev.little !== next.little}>
241+
{(_, __, form) => {
242+
// Fill to hide
243+
if (!form.getFieldValue('little')) {
244+
return <InfoField name="bamboo" preserve={false} />;
245+
}
246+
247+
return null;
248+
}}
249+
</Field>
250+
251+
<Field shouldUpdate={() => false}>
252+
{() => {
253+
console.log('render!');
254+
counter += 1;
255+
return null;
256+
}}
257+
</Field>
258+
</Form>,
259+
);
260+
expect(counter).toEqual(1);
261+
expect(container.querySelectorAll('input')).toHaveLength(2);
262+
263+
// hide should not re-render
264+
fireEvent.change(getInput(container, 0), { target: { value: '1' } });
265+
expect(container.querySelectorAll('input')).toHaveLength(1);
266+
expect(counter).toEqual(1);
267+
});
229268
});

0 commit comments

Comments
 (0)