antd pro后台管理项目中form表单的动态添加问题

本文详细介绍了如何在基于AntdPro的后台管理系统中实现动态表单,通过使用Form.List组件,可以轻松地添加和删除字段,满足员工档案、紧急联系人等信息的编辑需求。

在做的一个基于antd pro开发的一个后台管理系统中遇到这样一个需求,员工档案部分的地址信息,紧急联系人,教育经历需要编辑添加多段,因此遇到了antd中的form表单里面添加多个字段的问题,具体需求以及实现如下:
在这里插入图片描述

经过查阅官方文档,可以通过Form.List,以及内部提供的API来实现
下面附上源码

     <Form
        {...layout}
        form={form}
        name={props.titleid}
        onFinish={onFinish}
        initialValues={contectInfo}
      >
        <Row>
          <Col span={8}>
            {
             Object.keys(contectTitle).slice(0,3).map(item=>{
              if(contectTitle[item]==="姓名" || contectTitle[item]==="关系"){
                return (
                  <Form.Item name={item} 
                  label={contectTitle[item]} 
                  rules={[{ required:true, message: '请输入' }]}
                  key={`${item+Math.random()}`} hasFeedback>
                  <Input placeholder="请输入" />
                </Form.Item>
                )
              }
                return(
                  <Form.Item
                  name={item}
                  label={contectTitle[item]}
                  key={`${item+Math.random()}`}
                  rules={[{  message: '请输入' }]}
                >
                  <Input placeholder="请输入" />
                </Form.Item>
                )
             })  
            }
          </Col>
          <Col span={8}>
          {
             Object.keys(contectTitle).slice(3,6).map(item=>{
              if(contectTitle[item]==="是否重要" ){
                return (
                  <Form.Item name={item} 
                  label={contectTitle[item]} 
                  rules={[{ required:true, message: '请输入' }]}
                  key={`${item+Math.random()}`} hasFeedback>
                    <Radio.Group>
                      <Radio value="a"></Radio>
                      <Radio value="b"></Radio>
                    </Radio.Group>
                </Form.Item>
                )
              }
                return(
                  <Form.Item
                  name={item}
                  label={contectTitle[item]}
                  key={`${item+Math.random()}`}
                  rules={[{  message: '请输入' }]}
                >
                  <Input placeholder="请输入" />
                </Form.Item>
                )
             })  
            }
          </Col>
          <Col span={8}>
 
            {
             Object.keys(contectTitle).slice(6).map(item=>{
                return(
                  <Form.Item
                  name={item}
                  key={`${item+Math.random()}`}
                  label={contectTitle[item]}
                  rules={[{  message: '请输入' }]}
                >
                  <Input placeholder="请输入" />
                </Form.Item>
                )
             })  
            }
          </Col>
        </Row>
        <Row>
            <Col span={24}>
            <Divider dashed />

            </Col>
        </Row>
        //以下为动态添加的表单的代码,
   <Form.List name="names" >
    {(fields, { add, remove }) => {
      console.log("fields",fields)
      return (
        <div>
          {fields.map((field, index) => (
            <div key={field.key}>
              <Row>
                  <Col span={8}>
                    {
                      Object.keys(contectTitle).slice(0,3).map(item=>{
                      if(contectTitle[item]==="姓名" || contectTitle[item]==="关系"){
                        console.log(8888,field.name)
                        return (
                          <Form.Item 
                          name={[field.name, item]} //必须每个都添加上
                          label={contectTitle[item]} 
                          fieldKey={[field.fieldKey, "lastName"]}                         
                          rules={[{ required:true, message: '请输入' }]}
                            key={`${item+Math.random()}`}//必须每个都添加上hasFeedback>
                          <Input placeholder="请输入" />
                        </Form.Item>
                        )
                      }
                        return(
                          <Form.Item
                          name={[field.name, item]}
                          label={contectTitle[item]}
                          fieldKey={[field.fieldKey, "lastName"]}
                          key={`${item+Math.random()}`}
                          rules={[{  message: '请输入' }]}
                        >
                          <Input placeholder="请输入" />
                        </Form.Item>
                        )
                      })  
                    }
                  </Col>
                  <Col span={8}>
                  {
                      Object.keys(contectTitle).slice(3,6).map(item=>{
                      if(contectTitle[item]==="是否重要" ){
                        return (
                          <Form.Item name={[field.name, item]}
                          label={contectTitle[item]} 
                          rules={[{ required:true, message: '请输入' }]}
                          key={`${item+Math.random()}`}
                          fieldKey={[field.fieldKey, "lastName"]}
                           hasFeedback>
                            <Radio.Group>
                              <Radio value="a"></Radio>
                              <Radio value="b"></Radio>
                            </Radio.Group>
                        </Form.Item>
                        )
                      }
                        return(
                          <Form.Item
                          name={[field.name, item]}
                          label={contectTitle[item]}
                          key={`${item+Math.random()}`}
                          fieldKey={[field.fieldKey, "lastName"]}
                          rules={[{  message: '请输入' }]}
                        >
                          <Input placeholder="请输入" />
                        </Form.Item>
                        )
                      })  
                    }
                  </Col>
                  <Col span={8}>

                    {
                      Object.keys(contectTitle).slice(6).map(item=>{
                        return(
                          <Form.Item
                          name={[field.name, item]}
                          label={contectTitle[item]}
                          key={`${item+Math.random()}`}
                          fieldKey={[field.fieldKey, "lastName"]}
                          rules={[{  message: '请输入' }]}
                        >
                          <Input placeholder="请输入" />
                        </Form.Item>
                        )
                      })  
                    }
                  </Col>
                </Row>
                <Row>
                    <Col span={24}>
                    <Divider dashed />
                    <Form.Item>
                      {fields.length > 0 ? (
                      <MinusCircleOutlined
                        className="dynamic-delete-button"
                        style={{ margin: '0 8px' }}
                        onClick={() => {
                          remove(field.name);
                        }}
                      />
                    ) : null}
                    </Form.Item>  
                    </Col>
                </Row>
                </div>

          ))}
          <Form.Item>
            <Button 
            type="link" 
            onClick={() => {
              add();
            }}
            >
                +添加
              </Button>
          </Form.Item>
        </div>
      );
    }}
  </Form.List>
<think>好的,我现在要帮助用户了解Ant Design Pro的Editable Table。首先,我需要回忆一下Ant Design Pro的相关知识。Ant Design Pro是基于Ant Design和Umi框架的企业级中后台前端解决方案,而Editable Table是可编辑表格组件,常用于数据管理场景。 用户可能想知道Editable Table的基本用法、配置方法以及常见问题的解决方案。需要分步骤解释,结构清晰。先介绍基本概念,然后逐步讲解如何实现,包括代码示例和配置项说明。 接下来,我需要确保内容准确。比如,Editable Table是基于Ant Design的Table和Form组件封装的,所以需要提到如何结合使用这两个组件。同时,Ant Design Pro的版本可能会影响具体实现,但用户可能使用的是较新版本,所以应该基于最新的文档来说明。 要覆盖的主要点包括:如何定义列、启用编辑状态、处理数据保存、表单验证等。可能还需要提到行内编辑和弹出框编辑两种模式,以及如何切换不同的表单控件,比如输入框、选择器等。 需要注意用户的代码示例是否正确,比如使用useRef或useState来管理数据源,editable中的配置项如type、editable等。同时,要提醒用户关于数据提交和保存的逻辑,可能需要与后端API交互,这里要强调前端部分如何处理。 可能用户在使用时会遇到问题,比如表单验证不生效,或者保存数据时状态更新不正确。这时候需要给出常见问题排查的建议,比如检查form属性是否正确绑定,或者确保onValuesChange正确更新状态。 最后,确保使用中文,避免技术术语翻译不当,保持口语化但专业。结构上先概述,再分步骤详细说明,最后给出总结和参考资料,帮助用户进一步学习。</think>Ant Design Pro 的 Editable Table(可编辑表格)是基于 Ant Design Table 和 Form 组件封装的高阶组件,常用于实现表格行内编辑功能。以下将从实现原理、使用场景和代码示例三个层面进行解析: 一、核心实现原理 1. 数据驱动:通过 `dataSource` 属性管理表格数据 2. 表单集成:使用 `form` 属性绑定 Form 实例实现双向绑定 3. 状态控制:`editableKeys` 控制当前处于编辑状态的行标识 4. 渲染策略:通过 `render` 函数动态切换单元格的展示/编辑模式 二、典型使用场景 1. 商品价格批量编辑 2. 用户信息快速修改 3. 配置参数动态调整 4. 数据仪表盘即时更新 三、基础代码示例 ```typescript import { EditableProTable } from '@ant-design/pro-components'; const Demo = () => { const [dataSource, setDataSource] = useState([]); const [editableKeys, setEditableKeys] = useState([]); const columns = [ { title: '姓名', dataIndex: 'name', editable: (text, record, index) => index === 0 // 控制可编辑条件 }, { title: '年龄', dataIndex: 'age', valueType: 'digit' // 自动验证数字类型 } ]; return ( <EditableProTable rowKey="id" columns={columns} value={dataSource} onChange={setDataSource} editable={{ editableKeys, onSave: async (key, row) => { /* 保存逻辑 */ }, onChange: setEditableKeys }} /> ); }; ``` 四、进阶配置技巧 1. 验证规则:通过 `formItemProps` 设置字段校验规则 ```typescript { dataIndex: 'email', formItemProps: { rules: [{ type: 'email', message: '请输入有效邮箱' }] } } ``` 2. 自定义控件:使用 `renderFormItem` 实现复杂输入 ```typescript { dataIndex: 'gender', renderFormItem: () => ( <Select options={[ { label: '男', value: 'male' }, { label: '女', value: 'female' } ]}/> ) } ``` 五、常见问题排查 1. 数据更新延迟:确保使用 `useState` 或 `useRef` 管理数据源 2. 验证不生效:检查 `valueType` 是否与数据类型匹配 3. 编辑状态冲突:合理设置 `editableKeys` 的互斥逻辑 4. 性能优化:对大数据量场景使用虚拟滚动配置 建议结合官方文档(procomponents.ant.design/components/editable-table)进行实践,可通过 Storybook 示例快速掌握不同交互模式。实际开发中需注意数据序列化问题和防抖处理,特别是在频繁保存的场景下。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值