diff --git a/src/useForm.ts b/src/useForm.ts index 895da920..4f83a6c2 100644 --- a/src/useForm.ts +++ b/src/useForm.ts @@ -500,7 +500,7 @@ export class FormStore { const mergedPreserve = preserve !== undefined ? preserve : this.preserve; if (mergedPreserve === false && !isListField) { const namePath = entity.getNamePath(); - if (this.getFieldValue(namePath) !== undefined) { + if (namePath.length && this.getFieldValue(namePath) !== undefined) { this.store = setValue(this.store, namePath, undefined); } } diff --git a/tests/preserve.test.tsx b/tests/preserve.test.tsx index f3a18293..7c5feba6 100644 --- a/tests/preserve.test.tsx +++ b/tests/preserve.test.tsx @@ -137,5 +137,35 @@ describe('Form.Preserve', () => { errorSpy.mockRestore(); }); + + it('nest render props should not clean full store', () => { + let form: FormInstance; + + const wrapper = mount( +
{ + form = instance; + }} + > + + + + + {(_, __, { getFieldValue }) => + getFieldValue('light') === 'bamboo' ? {() => null} : null + } + +
, + ); + + wrapper.find('input').simulate('change', { target: { value: 'bamboo' } }); + expect(form.getFieldsValue()).toEqual({ light: 'bamboo' }); + + wrapper.find('input').simulate('change', { target: { value: 'little' } }); + expect(form.getFieldsValue()).toEqual({ light: 'little' }); + + wrapper.unmount(); + }); }); /* eslint-enable no-template-curly-in-string */