react 点击一行增加一行输入框,带删除功能的需求

在项目中碰到了如下图的需求,可以连续新增N组数据:

//定义一组空数据
const [rightsList, setRightsList] = useState<any[]>([
  { rightsNames: "", rightsIdCard: "" },
]);

// 新增一组事件
const handleAddRights = () => {
  if (rightsList.length < 10) {
    setRightsList([...rightsList, {}]);
  } else {
    return message.warning("最多只能添加10个产权人信息");
  }
};

// 删除事件 产权人姓名 和身份证
const handleDeleteRights = (index: number) => {
  const formValue = form.getFieldsValue();
  const list = [...rightsList];
  let nameObj = {} as any;
  list.forEach((item: any, i: number) => {
    if (i >= index) {
      let next = i + 1;
      nameObj["rightsNames" + i] = formValue["rightsNames" + next];
      nameObj["rightsIdCard" + i] = formValue["rightsIdCard" + next];
    }
  });
  list.splice(list.length - 1, 1);
  setRightsList(list);

  form.setFieldsValue({
    ...formValue,
    ...nameObj,
  });
};



//通过数据map循环渲染组件
{rightsList.map((ztem: any, index: number) => (
  <ProForm.Group key={index}>
    <ProFormText
      name={"rightsNames" + index}
      label={`产权人姓名${index + 1}`}
      width="md"
      placeholder="请输入产权人姓名"
      rules={[
        {
          required: true,
          message: "请输入产权人姓名",
        },
      ]}
    />
    <ProFormText
      name={"rightsIdCard" + index} //确认有
      label={`产权人证件号${index + 1}`}
      width="md"
      placeholder="请输入产权人证件号"
      rules={[
        {
          required: true,
          message: "请输入产权人证件号",
        },
      ]}
    />
    {index == 0 ? (
      <Button type="link" onClick={handleAddRights}>
        新增
      </Button>
    ) : (
      <Button
        type="link"
        onClick={(e) => handleDeleteRights(index)}
      >
        删除
      </Button>
    )}
  </ProForm.Group>
))}

//此表单数据提交时的数据处理:
// 产权人姓名和身份证参数 处理
let rightsNamesList = [] as string[];
let rightsIdCardList = [] as string[];
rightsList.forEach((item: any, index: number) => {
  rightsNamesList.push(values["rightsNames" + index]);
  rightsIdCardList.push(values["rightsIdCard" + index]);
});
params.rightsNames = rightsNamesList.join(",");
params.rightsIdCard = rightsIdCardList.join(",");
console.log("[ params ] 提交>----", params);

//如果需要涉及到表单回显,请看这里
// 产权人姓名和产权人身份证 回显
let rightsNamesObj = {} as any;
let rightsIdCardObj = {} as any;
let rights = [] as any[];
data.rightsNames?.forEach((name: string, index: number) => {
  rightsNamesObj["rightsNames" + index] = name;
  rightsIdCardObj["rightsIdCard" + index] = data.rightsIdCards
    ? data.rightsIdCards[index]
    : "";
  rights.push({});
});
setRightsList(rights);
if (data.rightsNames?.length == 0) {
  setRightsList([{}]);
}

 P.s:删除功能真的很烧脑,逻辑想了很久,代码实现写了很久,且看且珍惜!

最后来看一下数据提交时的数据格式叭

表单回显时后台返回的数据格式如下,请参考:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值