Skip to content

Commit 372b159

Browse files
authored
fix: submit not trigger field re-render (#202)
* fix: Should trigger re-render on submit * test: Add test case
1 parent b44c513 commit 372b159

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

src/Field.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,9 @@ class Field extends React.Component<InternalFieldProps, FieldState, InternalForm
323323
this.validatePromise = promise;
324324
this.errors = [];
325325

326+
// Force trigger re-render since we need sync renderProps with new meta
327+
this.reRender();
328+
326329
promise
327330
.catch(e => e)
328331
.then((errors: string[] = []) => {

tests/validate.test.js

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* eslint-disable no-template-curly-in-string */
22
import React from 'react';
33
import { mount } from 'enzyme';
4-
import Form, { Field } from '../src';
4+
import Form, { Field, useForm } from '../src';
55
import InfoField, { Input } from './common/InfoField';
66
import { changeValue, matchError, getField } from './common';
77
import timeout from './common/timeout';
@@ -578,5 +578,37 @@ describe('Form.Validate', () => {
578578
wrapper.update();
579579
matchError(wrapper, false);
580580
});
581+
582+
it('submit should trigger Field re-render', () => {
583+
const renderProps = jest.fn().mockImplementation(() => null);
584+
585+
const Demo = () => {
586+
const [form] = useForm();
587+
588+
return (
589+
<Form form={form}>
590+
<Field
591+
name="test"
592+
rules={[{ validator: async () => Promise.reject(new Error('Failed')) }]}
593+
>
594+
{renderProps}
595+
</Field>
596+
<button
597+
type="button"
598+
onClick={() => {
599+
form.submit();
600+
}}
601+
/>
602+
</Form>
603+
);
604+
};
605+
606+
const wrapper = mount(<Demo />);
607+
renderProps.mockReset();
608+
609+
// Should trigger validating
610+
wrapper.find('button').simulate('click');
611+
expect(renderProps.mock.calls[0][1]).toEqual(expect.objectContaining({ validating: true }));
612+
});
581613
});
582614
/* eslint-enable no-template-curly-in-string */

0 commit comments

Comments
 (0)