react+antd中做一个外部按钮新增 表格内部本地新增一条数据并且支持编辑删除(无难度上手)

需求背景

做一个可以外部控制新增刷新表格 表格内部可以编辑删除 类似下方需求图

实现过程

因为我实现时有两个这样的表格 所以我的事件里面会有传参用于判断 可忽略传参判断部分 代码中有formatMessage部分为国际化可忽略

javascript 复制代码
 <div style={{ marginBottom: '10px', marginTop: '10px', display: 'flex' }}>
          <Button type={'primary'} onClick={() => handleAddWhiteList(1)}>
            {formatMessage({ id: 'button.Add' })}
          </Button>

          <Button
            type={'primary'}
            style={{ marginLeft: '10px' }}
            onClick={() => onRefreshWhiteList(1)}
            icon={<SyncOutlined />}
          />
        </div>
        <Table
          size="small"
          columns={whiteColumns}
          dataSource={whiteDataSource}
          pagination={false}
          bordered={true}
          rowKey={'id'}
          scroll={{
            y: whiteDataSource?.length > 3 ? 55 * 3 : undefined, // 动态计算高度
          }}
        />


//js部分
  const [whiteDataSource, setWhiteDataSource] = useState([]);
  //白名单列表
  const whiteColumns = [
    {
      title: 'HOST',
      dataIndex: 'url',
      render: (text, record) => {
        return (
          <Input
            value={record.url}
            disabled={record.disabled}
            onBlur={(e) => handleUrlBlur(e, record.id, 1)}
            onChange={(e) => handleUrlWhitleChange(e, record.id, 1)}
            placeholder={formatMessage({ id: 'label.rollCall.PleaseEnter' })}
          />
        );
      },
    },
    {
      title: formatMessage({ id: 'label.Operation' }),
      dataIndex: 'operation',
      width: 120,
      render: (text, record) => {
        return (
          <Space size={'middle'}>
            <TableButton
              onClick={() => handleEdit(1, record)}
              disabled={!record.disabled}
              icon={
                <IconBtn
                  itemInfo={{ itemId: 'edit', title: formatMessage({ id: 'button.Edit' }) }}
                />
              }
            />

            <TableButton
              confirm
              confirmMsg={formatMessage({ id: 'confirm.Delete' })}
              onConfirm={() => handleDel(1, record)}
              icon={
                <IconBtn
                  itemInfo={{ itemId: 'delete', title: formatMessage({ id: 'button.Delete' }) }}
                />
              }
            />
          </Space>
        );
      },
    },
  ];
  const handleAddWhiteList = (num) => {
    if (num == 1) {
      setWhiteDataSource([
        ...whiteDataSource,
        { url: '', id: Date.now(), disabled: false, error: null },
      ]);
    } else {
      setBlackDataSource([
        ...blackDataSource,
        { url: '', id: Date.now(), disabled: false, error: null },
      ]);
    }
  };
  const onRefreshWhiteList = (num) => {
    if (num == 1) {
      setWhiteDataSource(whiteDataSource.filter((item) => item.url !== ''));
    } else {
      setBlackDataSource(blackDataSource.filter((item) => item.url !== ''));
    }
  };
  //名单失焦事件
  const handleUrlBlur = (e, id, num) => {
    if (num == 1) {
      const newData = whiteDataSource.map((item) => {
        if (item.id === id) {
          return { ...item, disabled: true };
        }
        return item;
      });
      setWhiteDataSource(newData);
    } else {
      const newData = blackDataSource.map((item) => {
        if (item.id === id) {
          return { ...item, disabled: true };
        }
        return item;
      });
      setBlackDataSource(newData);
    }
  };
  //名单输入事件
  const handleUrlWhitleChange = (e, id, num) => {
    if (num == 1) {
      const newData = whiteDataSource.map((item) => {
        if (item.id === id) {
          return { ...item, url: e.target.value };
        }
        return item;
      });
      setWhiteDataSource(newData);
    } else {
      const newData = blackDataSource.map((item) => {
        if (item.id === id) {
          return { ...item, url: e.target.value };
        }
        return item;
      });
      setBlackDataSource(newData);
    }
  };
//  编辑处理函数
  const handleEdit = (num, record) => {
    if (num == 1) {
      setWhiteDataSource((prev) =>
        prev.map((item) => (item.id === record.id ? { ...item, disabled: false } : item)),
      );
    } else {
      setBlackDataSource((prev) =>
        prev.map((item) => (item.id === record.id ? { ...item, disabled: false } : item)),
      );
    }
  };
  //删除处理
  const handleDel = (num, record) => {
    if (num == 1) {
      setWhiteDataSource((prev) => prev.filter((item) => item.id !== record.id));
    } else {
      setBlackDataSource((prev) => prev.filter((item) => item.id !== record.id));
    }
  };
相关推荐
huxihua200621 分钟前
各种前端框架界面
前端
拾光拾趣录22 分钟前
GET/POST 的区别:从“为什么登录请求不能用 GET”说起
前端·网络协议
Carlos_sam38 分钟前
OpenLayers:ol-wind之渲染风场图全解析
前端·javascript
拾光拾趣录1 小时前
闭包:从“变量怎么还没死”到写出真正健壮的模块
前端·javascript
拾光拾趣录1 小时前
for..in 和 Object.keys 的区别:从“遍历对象属性的坑”说起
前端·javascript
OpenTiny社区1 小时前
把 SearchBox 塞进项目,搜索转化率怒涨 400%?
前端·vue.js·github
编程猪猪侠2 小时前
Tailwind CSS 自定义工具类与主题配置指南
前端·css
qhd吴飞2 小时前
mybatis 差异更新法
java·前端·mybatis
YGY Webgis糕手之路2 小时前
OpenLayers 快速入门(九)Extent 介绍
前端·经验分享·笔记·vue·web
患得患失9492 小时前
【前端】【vueDevTools】使用 vueDevTools 插件并修改默认打开编辑器
前端·编辑器