Skip to content

Commit f28b401

Browse files
committed
feat: support the ability for validateTrigger to obtain data from the top form.
1 parent ec75935 commit f28b401

File tree

3 files changed

+29
-10
lines changed

3 files changed

+29
-10
lines changed

primitives/filed-form /src/Field.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const Field = <Values=any, T extends AllPaths<Values> = AllPaths<Values>>(props:
2424
rules,
2525
trigger = 'onChange',
2626
unControlledValueChange,
27-
validateTrigger = 'onChange',
27+
validateTrigger,
2828
valuePropName = 'value',
2929
...rest
3030
} = props;
@@ -40,7 +40,12 @@ const Field = <Values=any, T extends AllPaths<Values> = AllPaths<Values>>(props:
4040

4141
const cref = useRef<any>(null);
4242

43-
const { getFieldsValue, getFieldValue, getInternalHooks } = fieldContext as InternalFormInstance<Values>;
43+
const {
44+
getFieldsValue,
45+
getFieldValue,
46+
getInternalHooks,
47+
validateTrigger: fieldValidateTrigger
48+
} = fieldContext as unknown as InternalFormInstance<Values>;
4449

4550
const { dispatch, getInitialValue, registerField } = getInternalHooks();
4651

primitives/filed-form /src/FieldContext.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,16 +80,20 @@ export interface FormInstance<Values = any>
8080

8181
export interface InternalFormHooks<Values = any> extends InternalCallbacks<Values>, InternalFieldHooks<Values> {}
8282

83-
export interface InternalFormInstance<Values = any> extends FormInstance<Values> {
83+
export interface InternalFormContext<Values = any> extends FormInstance<Values> {
84+
validateTrigger: string | string[];
85+
}
86+
87+
export interface InternalFormInstance<Values = any> extends InternalFormContext<Values> {
8488
/** 内部 API,不建议外部使用 */
8589
getInternalHooks: () => InternalFormHooks<Values>;
8690
}
8791

88-
export const FieldContext = createContext<FormInstance | null>(null);
92+
export const FieldContext = createContext<InternalFormContext | null>(null);
8993

9094
export const FieldContextProvider = FieldContext.Provider;
9195

92-
export const useFieldContext = <Values = any>(): FormInstance<Values> => {
96+
export const useFieldContext = <Values = any>(): InternalFormContext<Values> => {
9397
const context = useContext(FieldContext);
9498

9599
if (!context) {

primitives/filed-form /src/Form.tsx

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
/* eslint-disable react-hooks/exhaustive-deps */
33

44
import type { ComponentPropsWithoutRef, ComponentRef, ElementType, HTMLProps, Ref } from 'react';
5-
import { forwardRef, useEffect, useImperativeHandle, useRef } from 'react';
5+
import { forwardRef, useEffect, useImperativeHandle, useMemo, useRef } from 'react';
66

7-
import type { FormInstance, InternalFormInstance, RegisterCallbackOptions } from './FieldContext';
7+
import type { FormInstance, InternalFormContext, InternalFormInstance, RegisterCallbackOptions } from './FieldContext';
88
import { FieldContextProvider } from './FieldContext';
99
import type { ValidateMessages } from './form-core/validate';
1010
import useForm from './useForm';
@@ -16,6 +16,7 @@ interface FormBaseProps<Values = any> extends RegisterCallbackOptions<Values> {
1616
initialValues?: Partial<Values>;
1717
preserve?: boolean;
1818
validateMessages?: ValidateMessages;
19+
validateTrigger?: string | string[];
1920
}
2021

2122
type PolymorphicProps<As extends ElementType, Own> = Own &
@@ -40,6 +41,7 @@ const Form = <Values=any, As extends ElementType = 'form'>(props: FormProps<Valu
4041
onValuesChange,
4142
preserve = true,
4243
validateMessages,
44+
validateTrigger = 'onChange',
4345
...rest
4446
} = props;
4547

@@ -53,6 +55,14 @@ const Form = <Values=any, As extends ElementType = 'form'>(props: FormProps<Valu
5355
formInstance as InternalFormInstance<Values>
5456
).getInternalHooks();
5557

58+
const formContextValue = useMemo<InternalFormContext<Values>>(
59+
() => ({
60+
...formInstance,
61+
validateTrigger
62+
}),
63+
[formInstance, validateTrigger]
64+
);
65+
5666
useImperativeHandle(ref as any, () => nativeElement.current);
5767

5868
if (!mountRef.current) {
@@ -78,14 +88,14 @@ const Form = <Values=any, As extends ElementType = 'form'>(props: FormProps<Valu
7888
}, []);
7989

8090
if (Component === false) {
81-
return <FieldContextProvider value={formInstance}>{children}</FieldContextProvider>;
91+
return <FieldContextProvider value={formContextValue}>{children}</FieldContextProvider>;
8292
}
8393

8494
if (Component === 'form') {
8595
const { onReset, onSubmit, ...formProps } = rest as HTMLProps<HTMLFormElement>;
8696

8797
return (
88-
<FieldContextProvider value={formInstance}>
98+
<FieldContextProvider value={formContextValue}>
8999
<Component
90100
{...formProps}
91101
ref={nativeElement as Ref<HTMLFormElement>}
@@ -108,7 +118,7 @@ const Form = <Values=any, As extends ElementType = 'form'>(props: FormProps<Valu
108118
}
109119

110120
return (
111-
<FieldContextProvider value={formInstance}>
121+
<FieldContextProvider value={formContextValue}>
112122
<Component
113123
{...(rest as any)}
114124
ref={nativeElement}

0 commit comments

Comments
 (0)