You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React+Material UI实现点击邀请新增表单、点击删除移除表单求助

Invite.js 多表单增删实现方案

你当前使用布尔值控制表单显隐的写法只能支持单个表单渲染,要实现点击新增按钮添加表单、点击删除按钮删除对应表单的需求,将状态改为数组类型存储所有表单实例即可,完整实现代码如下:

import * as React from "react";
import Box from "@mui/material/Box";
import FormControl from "@mui/material/FormControl";
import TextField from "@mui/material/TextField";
import AccountCircle from "@mui/icons-material/AccountCircle";
import Button from "@mui/material/Button";
import DeleteIcon from "@mui/icons-material/Delete";
import AddIcon from "@mui/icons-material/Add";
import Stack from "@mui/material/Stack";

const Invites = () => {
  // 用数组存储所有表单的唯一标识,也可扩展为存储表单数据的对象数组
  const [formList, setFormList] = React.useState([]);

  // 新增表单:往数组追加新的唯一ID,这里用时间戳实现,可替换为uuid
  const addFormHandler = () => {
    setFormList(prev => [...prev, Date.now()]);
  };

  // 删除对应表单:根据传入的ID过滤掉对应项
  const deleteHandler = (targetId) => {
    setFormList(prev => prev.filter(formId => formId !== targetId));
  };

  return (
    <>
      <Stack direction="row" spacing={2}>
        <Button
          variant="contained"
          color="info"
          startIcon={<AddIcon />}
          onClick={addFormHandler}
        >
          ADD INVITE
        </Button>
      </Stack>

      {/* 遍历数组渲染所有表单 */}
      {formList.map(formId => (
        <Box key={formId} sx={{ "& > :not(style)": { m: 1 } }}>
          <FormControl>
            <Box sx={{ display: "flex", alignItems: "flex-end", marginTop: 2 }}>
              <AccountCircle sx={{ color: "action.active", mr: 1, my: 0.5 }} />
              <TextField
                id={`input-name-${formId}`}
                label="姓名"
                variant="filled"
              />
            </Box>
            <Box sx={{ display: "flex", alignItems: "flex-end", marginTop: 2 }}>
              <AccountCircle sx={{ color: "action.active", mr: 1, my: 0.5 }} />
              <TextField
                id={`input-email-${formId}`}
                label="邮箱"
                variant="filled"
              />
            </Box>
            <Box sx={{ display: "flex", alignItems: "flex-end", marginTop: 2 }}>
              <AccountCircle sx={{ color: "action.active", mr: 1, my: 0.5 }} />
              <TextField
                id={`input-phone-${formId}`}
                label="手机号"
                variant="filled"
              />
            </Box>
            <Box sx={{ display: "flex", alignItems: "flex-end", marginTop: 2 }}>
              <AccountCircle sx={{ color: "action.active", mr: 1, my: 0.5 }} />
              <TextField
                id={`input-dept-${formId}`}
                label="部门"
                variant="filled"
              />
            </Box>
            
            <Stack
              direction="row"
              spacing={4}
              style={{ marginLeft: 30, marginTop: 18, width: 500 }}
            >
              <Button 
                variant="contained" 
                size="large" 
                startIcon={<DeleteIcon />} 
                onClick={() => deleteHandler(formId)}
              >
                Delete
              </Button>
            </Stack>
          </FormControl>
        </Box>
      ))}
    </>
  );
};
export default Invites;

关键逻辑说明

  • 新增逻辑:每次点击新增按钮,就往表单数组追加一个唯一ID,React会根据数组长度自动渲染新的表单块
  • 删除逻辑:每个表单绑定自身的唯一ID,点击删除按钮时传入对应ID,过滤数组后即可删除对应表单
  • 表单数据收集:如果需要收集所有表单的输入内容,可将数组项改为对象结构,存储对应表单的所有输入框值,配合TextField的onChange事件更新状态即可

内容的提问来源于stack exchange,提问作者Nidhi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:24:03