前言
使用react 函数式组件来写一个双重循环嵌套可增减的表单
效果图
静态
动态
代码如下
import { CloseOutlined, MinusCircleOutlined, PlusCircleOutlined, PlusOutlined } from '@ant-design/icons';
import { Button, Col, Form, Input, Row, Select } from 'antd';
import React, { useState } from 'react'
const { Option } = Select;
export default function AddItem() {
// pages结构:[[{id:随机数},{id:随机数}],[],[]] 代表有三个策略,第一个策略中有两个条目
const [pages, setPages] = useState([[]])
return (
<>
<Form>
{/* 遍历pages 数组个数对应着策略组数 */}
{pages.map((item, index) => {
return (
// 一个组中的内容如下
<div key={index}>
<Row style={{ marginLeft: 200 }}>
<Col xs={{ span: 24 }} sm={{ span: 4 }}> <span>策略{index + 1}:</span></Col>
<Col xs={{ span: 24 }} sm={{ span: 13 }}>
{item && item.length > 0 ? ( //每个策略中的条目大于0就展现条目 没有得话就展现「新增数据配置」
<div>
<Form.Item label=' ' colon={false}>
{item?.map(({ id }) => {
return (
<div key={id}>
<Form.Item label=' ' colon={false}>
<Input.Group compact>
<Form.Item>
<Select style={{ width: 200 }}>
<Option value="Zhejiang">Zhejiang</Option>
<Option value="Jiangsu">Jiangsu</Option>
</Select>
</Form.Item>
<Form.Item>
<Input style={{ width: 200 }} />
</Form.Item>
<Form.Item>
<PlusCircleOutlined style={{ marginLeft: 20 }} onClick={() => {
// 添加条目数 找到该条目所在组数 然后添加一个条目(添加一个代表条目数的对象{id:随机数})随机数是为了保持条目的唯一性
pages[index] = pages[index].concat([{ id: Math.random() }])
setPages([...pages])
}} />
<MinusCircleOutlined style={{ marginLeft: 20 }} onClick={() => {
// 删除策略组中的某一条目
const p = pages[index].filter(item => item.id !== id)
pages[index] = p
setPages([...pages])
}} /></Form.Item>
</Input.Group>
</Form.Item>
</div>
)
})}
</Form.Item>
</div>)
:
<Form.Item label=' ' colon={false}>
<Button type="dashed" block icon={<PlusOutlined />} style={{ width: 200 }} onClick={() => {
// 添加策略组中的条目
pages[index] = pages[index].concat([{ id: Math.random() }])
setPages([...pages])
}}>新增数据配置</Button><CloseOutlined style={{ marginLeft: 20 }} onClick={() => {
// 删除当前策略组
const p = pages.filter((item, itemIndex) => index !== itemIndex)
setPages([...p])
}} />
</Form.Item>
}
</Col>
</Row>
</div>
)
})}
<Form.Item label=' ' colon={false} labelCol={{ span: 4 }} wrapperCol={{ span: 13 }}>
<Button type="dashed" block icon={<PlusOutlined />} style={{ width: 600 }} onClick={() => {
// 点击按钮增加组数
setPages(pages.concat([[]]))
}}>新增策略</Button>
</Form.Item>
</Form></>
)
}