Skip to content

Commit

Permalink
fix(core): fix validate lifecycle wrong trigger in skip digest (#2279)
Browse files Browse the repository at this point in the history
  • Loading branch information
janryWang authored Oct 11, 2021
1 parent 17b9315 commit 1ac87fb
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 10 deletions.
52 changes: 49 additions & 3 deletions packages/core/src/__tests__/form.spec.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { createForm } from '../'
import {
onFieldValidateStart,
onFieldValueChange,
onFormInitialValuesChange,
onFormValuesChange,
Expand Down Expand Up @@ -1246,7 +1247,16 @@ test('designable form', () => {
})

test('validate will skip display none', async () => {
const form = attach(createForm())
const validateA = jest.fn()
const validateB = jest.fn()
const form = attach(
createForm({
effects() {
onFieldValidateStart('aa', validateA)
onFieldValidateStart('bb', validateB)
},
})
)
const validator = jest.fn()
const aa = attach(
form.createField({
Expand Down Expand Up @@ -1288,6 +1298,8 @@ test('validate will skip display none', async () => {
},
])
}
expect(validateA).toBeCalledTimes(1)
expect(validateB).toBeCalledTimes(1)
expect(aa.invalid).toBeTruthy()
expect(bb.invalid).toBeTruthy()
expect(validator).toBeCalledTimes(2)
Expand All @@ -1306,18 +1318,31 @@ test('validate will skip display none', async () => {
},
])
}
expect(validateA).toBeCalledTimes(1)
expect(validateB).toBeCalledTimes(2)
expect(aa.invalid).toBeFalsy()
expect(bb.invalid).toBeTruthy()
expect(validator).toBeCalledTimes(3)
bb.display = 'none'
await form.validate()
expect(validateA).toBeCalledTimes(1)
expect(validateB).toBeCalledTimes(2)
expect(aa.invalid).toBeFalsy()
expect(bb.invalid).toBeFalsy()
expect(validator).toBeCalledTimes(3)
})

test('validate will skip unmounted', async () => {
const form = attach(createForm())
const validateA = jest.fn()
const validateB = jest.fn()
const form = attach(
createForm({
effects() {
onFieldValidateStart('aa', validateA)
onFieldValidateStart('bb', validateB)
},
})
)
const validator = jest.fn()
const aa = attach(
form.createField({
Expand Down Expand Up @@ -1359,6 +1384,8 @@ test('validate will skip unmounted', async () => {
},
])
}
expect(validateA).toBeCalledTimes(1)
expect(validateB).toBeCalledTimes(1)
expect(aa.invalid).toBeTruthy()
expect(bb.invalid).toBeTruthy()
expect(validator).toBeCalledTimes(2)
Expand All @@ -1377,18 +1404,31 @@ test('validate will skip unmounted', async () => {
},
])
}
expect(validateA).toBeCalledTimes(1)
expect(validateB).toBeCalledTimes(2)
expect(aa.invalid).toBeFalsy()
expect(bb.invalid).toBeTruthy()
expect(validator).toBeCalledTimes(3)
bb.onUnmount()
await form.validate()
expect(validateA).toBeCalledTimes(1)
expect(validateB).toBeCalledTimes(2)
expect(aa.invalid).toBeFalsy()
expect(bb.invalid).toBeFalsy()
expect(validator).toBeCalledTimes(3)
})

test('validate will skip uneditable', async () => {
const form = attach(createForm())
const validateA = jest.fn()
const validateB = jest.fn()
const form = attach(
createForm({
effects() {
onFieldValidateStart('aa', validateA)
onFieldValidateStart('bb', validateB)
},
})
)
const validator = jest.fn()
const aa = attach(
form.createField({
Expand Down Expand Up @@ -1430,6 +1470,8 @@ test('validate will skip uneditable', async () => {
},
])
}
expect(validateA).toBeCalledTimes(1)
expect(validateB).toBeCalledTimes(1)
expect(aa.invalid).toBeTruthy()
expect(bb.invalid).toBeTruthy()
expect(validator).toBeCalledTimes(2)
Expand All @@ -1448,11 +1490,15 @@ test('validate will skip uneditable', async () => {
},
])
}
expect(validateA).toBeCalledTimes(1)
expect(validateB).toBeCalledTimes(2)
expect(aa.invalid).toBeFalsy()
expect(bb.invalid).toBeTruthy()
expect(validator).toBeCalledTimes(3)
bb.editable = false
await form.validate()
expect(validateA).toBeCalledTimes(1)
expect(validateB).toBeCalledTimes(2)
expect(aa.invalid).toBeFalsy()
expect(bb.invalid).toBeFalsy()
expect(validator).toBeCalledTimes(3)
Expand Down
22 changes: 15 additions & 7 deletions packages/core/src/shared/internals.ts
Original file line number Diff line number Diff line change
Expand Up @@ -255,13 +255,6 @@ export const validateToFeedbacks = async (
field: Field,
triggerType?: ValidatorTriggerType
) => {
if (
field.pattern !== 'editable' ||
field.display !== 'visible' ||
field.unmounted
)
return {}

const results = await validate(field.value, field.validator, {
triggerType,
validateFirst: field.props.validateFirst || field.form.props.validateFirst,
Expand Down Expand Up @@ -880,6 +873,14 @@ export const batchValidate = async (
triggerType?: ValidatorTriggerType
) => {
if (isForm(target)) target.setValidating(true)
else {
if (
target.pattern !== 'editable' ||
target.display !== 'visible' ||
target.unmounted
)
return
}
const tasks = []
target.query(pattern).forEach((field) => {
if (!isVoidField(field)) {
Expand Down Expand Up @@ -932,6 +933,13 @@ export const validateSelf = batch.bound(
target.notify(LifeCycleTypes.ON_FIELD_VALIDATE_FAILED)
}
}

if (
target.pattern !== 'editable' ||
target.display !== 'visible' ||
target.unmounted
)
return {}
start()
if (!triggerType) {
const allTriggerTypes = parseValidatorDescriptions(target.validator).map(
Expand Down

0 comments on commit 1ac87fb

Please sign in to comment.