antd react ts 双重循环嵌套可增减表单


前言

使用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></>
  )
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值