Antd在Modal中嵌套Form并提交

本文介绍了如何在Ant Design的Modal组件中嵌套Form,并利用React.createRef进行表单提交。适用版本为Antd4.0和5.0。通过在Modal的确定按钮点击事件中调用Form的submit方法,实现美观的表单提交效果。

Antd在Modal中嵌套Form并提交

适用版本:Antd4.0、Antd5.0

参考资料:

问题描述

因为不同业务场景的原因,我们可能需要在Modal(弹窗)中创建Form(表单),但是为了美观,使用Modal footer 中的确认按钮来提交内部的Form数据。

需要的效果如下图,可以在点击Modal的确定按钮时,提交Form中的数据。
在这里插入图片描述

问题解决

效果图:

在这里插入图片描述

为了解决我们这一需求,只需要引入React.createRef(),并将其添加在from属性中即可ref={formRef}

简要代码如下:

const view=()={
   
   
  // ...省略无关代码
  
	const formRef = React.createRef<FormInstance>();
  const showModal = 
在 Ant Design Pro 中使用 `ProForm` 组件处理嵌套表单的赋值时,关键在于理解如何构造嵌套结构的数据,通过 `form.setFieldsValue` 方法进行赋值。由于表单嵌套层级和字段名(name)是动态的,需要构造一个能够处理任意层级嵌套的赋值函数。 ### 动态设置嵌套表单项的值 可以使用递归或循环的方式构建一个函数,该函数接收字段名数组 `nameArr` 和对应的值对象 `innerValue`,返回一个嵌套结构的对象,最终通过 `form.setFieldsValue` 设置到表单中。 ```javascript const nameArr = ['user', 'info', 'gender']; // 嵌套字段名数组 const innerValue = 'male'; const itemObj = (nameArr, innerValue) => { let valueObj = {}; for (let i = nameArr.length - 1; i >= 0; i--) { valueObj = i === nameArr.length - 1 ? { [nameArr[i]]: innerValue } : { [nameArr[i]]: { ...valueObj } }; } return valueObj; }; // 调用赋值函数 const onFill = () => { form.setFieldsValue(itemObj(nameArr, innerValue)); }; ``` ### 使用 `ProForm` 处理动态嵌套表单 当涉及到 `ProForm` 和嵌套结构时,推荐使用 `Form.Item` 的 `name` 属性来指定嵌套路径。例如,如果需要设置 `user.info.gender` 的值,可以直接在 `Form.Item` 上设置 `name={['user', 'info', 'gender']}`。 ```jsx import { ProForm } from '@ant-design/pro-components'; export default () => { const [form] = ProForm.useForm(); const handleFill = () => { const nameArr = ['user', 'info', 'note']; const innerValue = { text: 'Hello world!' }; const valueObj = itemObj(nameArr, innerValue); form.setFieldsValue(valueObj); }; return ( <ProForm form={form}> <ProForm.Item label="Note" name={['user', 'info', 'note']} fieldProps={{ text: '' }}> <Input /> </ProForm.Item> <Button onClick={handleFill}>填充表单</Button> </ProForm> ); }; ``` ### 处理数组嵌套 对于嵌套数组的情况,需要注意 `Form.List` 的使用方式,确保在 `name` 前面使用 `...field` 或 `...list` 来展开字段信息,以便正确渲染表单项。在赋值时,由于数组是引用类型,建议使用 `getFieldsValue` 获取当前表单值,通过数组的变异方法(如 `splice`)修改数组内容。 ```jsx import { Form, Button } from 'antd'; export default () => { const [form] = Form.useForm(); const handleAdd = () => { const list = form.getFieldsValue(['users']).users || []; list.push({ name: '', age: '' }); form.setFieldsValue({ users: list }); }; return ( <Form form={form} layout="vertical"> <Form.List name="users"> {(fields) => fields.map(({ key, name, ...restField }) => ( <div key={key}> <Form.Item {...restField} label="Name" name={[name, 'name']} rules={[{ required: true }]}> <Input /> </Form.Item> <Form.Item {...restField} label="Age" name={[name, 'age']} rules={[{ required: true }]}> <InputNumber /> </Form.Item> </div> )) } </Form.List> <Button onClick={handleAdd}>添加用户</Button> </Form> ); }; ``` ### 表单赋值注意事项 - **动态赋值**:使用 `form.setFieldsValue` 时,确保传递的值对象结构与表单字段的 `name` 结构一致。 - **初始值设置**:对于 `Modal` 中的表单,应使用 `initialValue` 或在 `useEffect` 中设置初始值,以确保表单在打开时显示正确的数据。 - **引用类型处理**:当处理数组或对象时,注意使用不可变数据模式,避免直接修改原始数据[^2]。 ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值