diff --git a/packages/core/src/__tests__/field.spec.ts b/packages/core/src/__tests__/field.spec.ts index bdb4a7c0f0d..b1c7b640003 100644 --- a/packages/core/src/__tests__/field.spec.ts +++ b/packages/core/src/__tests__/field.spec.ts @@ -1,5 +1,5 @@ import { autorun, batch } from '@formily/reactive' -import { createForm } from '../' +import { createForm, onFieldReact, isField } from '../' import { DataField } from '../types' import { attach, sleep } from './shared' @@ -1879,3 +1879,59 @@ test('object field reset', async () => { }) expect(input.value).toBe('123') }) + +test('field visible default value should work', () => { + const form = attach( + createForm({ + effects(form) { + onFieldReact('obj.input1', (field) => { + field.pattern = 'disabled' + }) + onFieldReact('obj', (field) => { + field.visible = form.values.select !== 'none' + }) + onFieldReact('obj.input1', (field) => { + if (isField(field)) { + field.initialValue = '123' + } + }) + onFieldReact('obj.input2', (field) => { + if (isField(field)) { + field.value = form.values.select + } + }) + }, + }) + ) + + const select = attach( + form.createField({ + name: 'select', + }) + ) + + attach( + form.createObjectField({ + name: 'obj', + }) + ) + + attach( + form.createField({ + name: 'input1', + basePath: 'obj', + }) + ) + + attach( + form.createField({ + name: 'input2', + basePath: 'obj', + }) + ) + + select.value = 'none' + expect(form.values.obj?.input1).toBeUndefined() + select.value = 'visible' + expect(form.values.obj.input1).toBe('123') +}) diff --git a/packages/core/src/models/Field.ts b/packages/core/src/models/Field.ts index 63db0a6c44c..7cf4f200e5d 100644 --- a/packages/core/src/models/Field.ts +++ b/packages/core/src/models/Field.ts @@ -248,7 +248,7 @@ export class Field< this.caches.value = undefined } } else { - this.caches.value = toJS(value) + this.caches.value = toJS(value) ?? toJS(this.initialValue) if (display === 'none') { this.form.deleteValuesIn(this.path) }