Skip to content

Commit 29366c0

Browse files
committed
fix(ProForm): 通过ref可获取表单方法
1 parent 0d56929 commit 29366c0

File tree

4 files changed

+48
-18
lines changed

4 files changed

+48
-18
lines changed

examples/base/src/pages/Demo/Detail/index.tsx

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,16 @@ const Detail = ({ updateData }: DetailProps) => {
3232
const form = useForm()
3333
const form2 = useForm()
3434

35+
const asyncAwaitFormList: any = (arr = []) => {
36+
return (
37+
arr &&
38+
arr.length > 0 &&
39+
Promise.all(arr).then((vals) => {
40+
return vals
41+
})
42+
)
43+
}
44+
3545
const onClose = () => dispatch({ type: 'demo/clean' })
3646

3747
// 模拟搜索
@@ -45,20 +55,12 @@ const Detail = ({ updateData }: DetailProps) => {
4555
}
4656

4757
const handleSave = async () => {
48-
// 触发验证
49-
await form.submitvalidate()
50-
await form2.submitvalidate()
51-
52-
// 获取错误信息
53-
const errors = form.getError()
54-
const errors2 = form2.getError()
55-
56-
if (errors && Object.keys(errors).length > 0) return
57-
if (errors2 && Object.keys(errors2).length > 0) return
58-
// 调用接口
59-
const datas1 = form.getFieldValues() || {}
60-
const datas2 = form.getFieldValues() || {}
61-
console.log('obj', { ...datas1, ...datas2 })
58+
// 触发验证获取值
59+
const values = await asyncAwaitFormList([
60+
form?.validateFieldsAndGetValue(),
61+
form2?.validateFieldsAndGetValue(),
62+
])
63+
console.log('values', values)
6264
}
6365

6466
return (

packages/components/src/ProForm/formdom.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ function FormDom({
2727
const store = useStore();
2828
const colProps = useColPropsContext();
2929

30-
const { setFormState } = store as any;
30+
const { setFormState } = store as {
31+
setFormState: ((p: any) => void) | undefined;
32+
};
3133

3234
// 通过store获取表单实例
3335
useEffect(() => setFormState?.(baseRef), [baseRef]);
@@ -36,6 +38,7 @@ function FormDom({
3638
useEffect(() => {
3739
formInstanceRef.current = baseRef;
3840
}, [baseRef]);
41+
3942
return (
4043
<Form
4144
ref={baseRef}

packages/components/src/ProForm/hooks/useForm.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ const useForm = () => {
1414
const getError = () => formState?.current?.getError() || {};
1515

1616
// 验证并获取表单值
17-
const validateFieldsAndGetValue = async () => {
17+
const validateFieldsAndGetValue = () => {
1818
return new Promise(async function (resolve, reject) {
1919
await submitvalidate();
2020
const errors = getError();

packages/components/src/ProForm/index.tsx

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import ReadFormDom from './readform';
55
import { getFormFields } from './widgets';
66
import { ProFormProps, UseFormStateProps, UseFormProps } from './type';
77
import { StoreCtx, ColPropsContext } from './hooks/store';
8+
import { isObjectEmpty } from './utils';
89
import './style/form-item.less';
910

1011
function ProForm(
@@ -36,9 +37,33 @@ function ProForm(
3637

3738
const store = useMemo(() => ({ setFormState }), [form]);
3839

39-
// 通过ref导出实例方法
4040
const formInstanceRef = useRef<{ current: UseFormStateProps }>();
41-
useImperativeHandle(ref, () => ({ ...form }));
41+
42+
// 通过ref导出实例方法
43+
useImperativeHandle(ref, () => {
44+
const { onSubmit, getError, getFieldValues } =
45+
formInstanceRef?.current?.current || {};
46+
// 表单验证(同时兼容老api submitvalidate和新api onSubmit )
47+
const submitvalidate = () => onSubmit?.() || null;
48+
// 验证并获取表单值
49+
const validateFieldsAndGetValue = () => {
50+
return new Promise(async function (resolve, reject) {
51+
await submitvalidate();
52+
const errors = getError?.() || {};
53+
if (isObjectEmpty(errors)) {
54+
const value = getFieldValues?.() || {};
55+
resolve(value);
56+
} else {
57+
reject(errors);
58+
}
59+
});
60+
};
61+
return {
62+
...formInstanceRef.current?.current,
63+
submitvalidate,
64+
validateFieldsAndGetValue,
65+
};
66+
});
4267

4368
let children: React.ReactNode;
4469
const formDomProps = { ...props, formfields, formInstanceRef };

0 commit comments

Comments
 (0)