import { useEffect } from 'react' import { isEmpty } from 'lodash' import { Form } from 'antd' import { FormInstance } from 'antd/lib/form' import download from 'ROOT_SOURCE/utils/download' import { showError } from 'ROOT_SOURCE/utils/showError' interface IProps { /* redux存储的form表单查询数据 */ formData?: IAnyObject; /* form 表单提交前的勾子方法,可以用来清理table的选中数据,一般是redux-action中提供的方法 */ resetTable?: Function; /* 提交表单更新table列表数据方法,一般是redux-action中提供的方法,也可以自定义 */ updateTable?: (values: IAnyObject) => any; /* 当进入页面时是否自动查询,默认自动查询 */ autoSubmit?: boolean; /* form表达查询前对查询数据进行格式化处理方法 */ adaptFormData?: (values: IAnyObject) => IAnyObject; } export function useBaseForm({ formData, resetTable, updateTable, autoSubmit = true, adaptFormData = values => values, }: IProps = {}): [ // antd-form 实例 FormInstance, // 提交表单 (values: IAnyObject) => void, // 重置表单 () => void, // 导出表单数据 (api: string) => void ] { const [form] = Form.useForm() // 初始化调用,进入页面请求列表 useEffect(() => { initFetch() // eslint-disable-next-line react-hooks/exhaustive-deps }, []) function initFetch(): void { if (!formData) { return; } if (!isEmpty(formData)) { form.setFieldsValue(formData) // 这时使用redux缓存数据更新,可以直接请求上传查看页面 autoSubmit && updateTable && updateTable(formData) return; } // 首次进入页面,自动触发submit autoSubmit && form.submit() } // 手动触发提交表单 function onFinish(values: IAnyObject): void { // 重置table resetTable && resetTable() // _formData里的一些值需要适配 const _formData: IAnyObject = adaptFormData(values) // action updateTable && updateTable(_formData) } // 重置表单 function onReset(): void { form.resetFields() } // 导出表单 async function onExport(exportApi: string) { console.log(form.getFieldsValue()) if (!exportApi) return try { await download(exportApi, { ...formData, ...form.getFieldsValue() }) } catch (e) { showError(e) } } return [form, onFinish, onReset, onExport] }