/* * @Author: yangzonglong * @Date: 2021-09-10 17:15:05 * @version: v1.0.0 * @Descripttion: * @LastEditors: yangzonglong * @LastEditTime: 2021-09-14 09:19:28 * @Auditor: */ import React, { forwardRef, useImperativeHandle, useRef, useState, useEffect, useMemo } from 'react'; import { Form, Row } from 'antd'; import FormItem from './FormItem'; import { FormProps, FormRefProps, FormItemProps } from './interface'; import { getFormExtraValues, handFormItemsTempStr, handFormValues, handInitialValues } from './util'; const labelCol: { style: React.CSSProperties } = { style: { width: '108px', textAlign: 'left', paddingLeft: '16px' } } const Formx: React.ForwardRefRenderFunction = (props, ref) => { const { extra, formItems, groupNumber, initialValues, onValuesChange, ...formProps } = props; const [form] = Form.useForm(); const [_formItems, setFormItems] = useState([]); const extraValues = useRef>({}); useImperativeHandle(ref, () => ({ ...form, validateFields: async () => { const values = await form.validateFields(); return values ? handFormValues( formItems, { ...values, ...extraValues.current } ) : values } })); useEffect(() => { setFormItems(handFormItemsTempStr(formItems, initialValues || {})) }, [formItems, initialValues]); function _onValuesChange(changedValues: Record, allValues: Record) { const formItemExtraData = getFormExtraValues(); extraValues.current = { ...extraValues.current, ...allValues, ...formItemExtraData }; setFormItems(handFormItemsTempStr(formItems, extraValues.current)); form.setFieldsValue(extraValues.current); onValuesChange?.(changedValues, extraValues.current); }; const _initialValues = useMemo(() => { return initialValues ? handInitialValues(formItems, initialValues) : initialValues }, [initialValues, formItems]); return (
{_formItems.map(item => ( ))}
) } export default forwardRef(Formx);