Skip to content

Commit bdcdba6

Browse files
authored
fix: List.Field should keep status (#133)
* fix: Add list field mark * add test case
1 parent 8450818 commit bdcdba6

File tree

3 files changed

+65
-19
lines changed

3 files changed

+65
-19
lines changed

src/Field.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ export interface InternalFieldProps {
7676

7777
export interface FieldProps extends Omit<InternalFieldProps, 'name'> {
7878
name?: NamePath;
79+
80+
/** @private Passed by Form.List props. */
81+
isListField?: boolean;
7982
}
8083

8184
export interface FieldState {
@@ -491,9 +494,14 @@ class Field extends React.Component<InternalFieldProps, FieldState, InternalForm
491494
}
492495
}
493496

494-
const WrapperField: React.FC<FieldProps> = ({ name, ...restProps }) => {
497+
const WrapperField: React.FC<FieldProps> = ({ name, isListField, ...restProps }) => {
495498
const namePath = name !== undefined ? getNamePath(name) : undefined;
496-
return <Field key={`_${(namePath || []).join('_')}`} name={namePath} {...restProps} />;
499+
500+
let key: string = 'keep';
501+
if (!isListField) {
502+
key = `_${(namePath || []).join('_')}`;
503+
}
504+
return <Field key={key} name={namePath} {...restProps} />;
497505
};
498506

499507
export default WrapperField;

src/List.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { move, getNamePath } from './utils/valueUtil';
88
interface ListField {
99
name: number;
1010
key: number;
11+
isListField: boolean;
1112
}
1213

1314
interface ListOperations {
@@ -117,6 +118,7 @@ const List: React.FunctionComponent<ListProps> = ({ name, children }) => {
117118
return {
118119
name: index,
119120
key,
121+
isListField: true,
120122
};
121123
},
122124
),

tests/list.test.js

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -217,25 +217,61 @@ describe('Form.List', () => {
217217
matchKey(1, '2');
218218
});
219219

220-
it('validate', async () => {
221-
const [, getList] = generateForm(
222-
fields => (
223-
<div>
224-
{fields.map(field => (
225-
<Field {...field} rules={[{ required: true }]}>
226-
<Input />
227-
</Field>
228-
))}
229-
</div>
230-
),
231-
{
232-
initialValues: { list: [''] },
233-
},
234-
);
220+
describe('validate', () => {
221+
it('basic', async () => {
222+
const [, getList] = generateForm(
223+
fields => (
224+
<div>
225+
{fields.map(field => (
226+
<Field {...field} rules={[{ required: true }]}>
227+
<Input />
228+
</Field>
229+
))}
230+
</div>
231+
),
232+
{
233+
initialValues: { list: [''] },
234+
},
235+
);
235236

236-
await changeValue(getField(getList()), '');
237+
await changeValue(getField(getList()), '');
237238

238-
expect(form.getFieldError(['list', 0])).toEqual(["'list.0' is required"]);
239+
expect(form.getFieldError(['list', 0])).toEqual(["'list.0' is required"]);
240+
});
241+
242+
it('remove should keep error', async () => {
243+
const [wrapper, getList] = generateForm(
244+
(fields, { remove }) => (
245+
<div>
246+
{fields.map(field => (
247+
<Field {...field} rules={[{ required: true }]}>
248+
<Input />
249+
</Field>
250+
))}
251+
252+
<button
253+
type="button"
254+
onClick={() => {
255+
remove(0);
256+
}}
257+
/>
258+
</div>
259+
),
260+
{
261+
initialValues: { list: ['', ''] },
262+
},
263+
);
264+
265+
expect(wrapper.find(Input)).toHaveLength(2);
266+
await changeValue(getField(getList(), 1), '');
267+
expect(form.getFieldError(['list', 1])).toEqual(["'list.1' is required"]);
268+
269+
wrapper.find('button').simulate('click');
270+
wrapper.update();
271+
272+
expect(wrapper.find(Input)).toHaveLength(1);
273+
expect(form.getFieldError(['list', 0])).toEqual(["'list.1' is required"]);
274+
});
239275
});
240276

241277
it('warning if children is not function', () => {

0 commit comments

Comments
 (0)