diff --git a/packages/core/src/__tests__/internals.spec.ts b/packages/core/src/__tests__/internals.spec.ts index 5aa43666964..03adaa8fac6 100644 --- a/packages/core/src/__tests__/internals.spec.ts +++ b/packages/core/src/__tests__/internals.spec.ts @@ -5,7 +5,7 @@ import { deserialize, isHTMLInputEvent, } from '../shared/internals' -import { createForm } from '../' +import { createForm, onFieldValueChange } from '../' import { attach } from './shared' test('getValuesFromEvent', () => { @@ -109,3 +109,31 @@ test('isHTMLInputEvent', () => { expect(isHTMLInputEvent({ target: {}, stopPropagation() {} })).toBeFalsy() expect(isHTMLInputEvent({})).toBeFalsy() }) + +test('reset when field display is none should be keep value', () => { + const valueChange = jest.fn() + const form = attach( + createForm({ + initialValues: { + input: '123', + }, + effects: () => { + onFieldValueChange('input', valueChange) + }, + }) + ) + attach( + form.createField({ + name: 'input', + }) + ) + expect(form.values.input).toEqual('123') + form.fields['input'].setDisplay('none') + expect(form.values.input).toBeUndefined() + expect(valueChange).toBeCalledTimes(1) + form.reset() + form.reset() + form.fields['input'].setDisplay('visible') + expect(form.values.input).toEqual('123') + expect(valueChange).toBeCalledTimes(2) +}) diff --git a/packages/core/src/shared/internals.ts b/packages/core/src/shared/internals.ts index e9b899f85ce..f1c34d89d2e 100644 --- a/packages/core/src/shared/internals.ts +++ b/packages/core/src/shared/internals.ts @@ -995,6 +995,13 @@ export const resetSelf = batch.bound( target.inputValue = typedDefaultValue target.inputValues = [] target.caches = {} + if (target.display === 'none') { + const value = + options?.forceClear || isUndef(target.initialValue) + ? typedDefaultValue + : toJS(target.initialValue) + target.caches.value = value + } if (!isUndef(target.value)) { if (options?.forceClear) { target.value = typedDefaultValue