fix: name connect

This commit is contained in:
zombiej 2021-01-19 11:53:44 +08:00
parent 687b68b256
commit 9a01c9ea0b
2 changed files with 14 additions and 4 deletions

View File

@ -20,6 +20,8 @@ import { cloneElement, isValidElement } from '../_util/reactNode';
import useFrameState from './hooks/useFrameState';
import useItemRef from './hooks/useItemRef';
const NAME_SPLIT = '__SPLIT__';
const ValidateStatuses = tuple('success', 'warning', 'error', 'validating', '');
export type ValidateStatus = typeof ValidateStatuses[number];
@ -115,7 +117,7 @@ function FormItem<Values = any>(props: FormItemProps<Values>): React.ReactElemen
React.useEffect(
() => () => {
destroyRef.current = true;
updateItemErrors(nameRef.current.join('__SPLIT__'), []);
updateItemErrors(nameRef.current.join(NAME_SPLIT), []);
},
[],
);
@ -126,8 +128,13 @@ function FormItem<Values = any>(props: FormItemProps<Values>): React.ReactElemen
// Collect noStyle Field error to the top FormItem
const updateChildItemErrors = noStyle
? updateItemErrors
: (subName: string, subErrors: string[]) => {
: (subName: string, subErrors: string[], originSubName: string) => {
setInlineErrors((prevInlineErrors = {}) => {
// Clean up origin error when name changed
if (originSubName !== subName) {
delete prevInlineErrors[originSubName];
}
if (!isEqual(prevInlineErrors[subName], subErrors)) {
return {
...prevInlineErrors,
@ -280,12 +287,15 @@ function FormItem<Values = any>(props: FormItemProps<Values>): React.ReactElemen
const fieldId = getFieldId(mergedName, formName);
if (noStyle) {
// Clean up origin one
const originErrorName = nameRef.current.join(NAME_SPLIT);
nameRef.current = [...mergedName];
if (fieldKey) {
const fieldKeys = Array.isArray(fieldKey) ? fieldKey : [fieldKey];
nameRef.current = [...mergedName.slice(0, -1), ...fieldKeys];
}
updateItemErrors(nameRef.current.join('__SPLIT__'), errors);
updateItemErrors(nameRef.current.join(NAME_SPLIT), errors, originErrorName);
}
const isRequired =

View File

@ -27,7 +27,7 @@ export const FormContext = React.createContext<FormContextProps>({
/** Form Item Context. Used for Form noStyle Item error collection */
export interface FormItemContextProps {
updateItemErrors: (name: string, errors: string[]) => void;
updateItemErrors: (name: string, errors: string[], originName?: string) => void;
}
export const FormItemContext = React.createContext<FormItemContextProps>({