react antdesign实现表格嵌套表单

一直使用elementui,后期使用antDesign个人感觉封装的很死没有elementui灵活,也可能是自己不熟吧。做个表格嵌套表单弄半天了。记录下这一过程。官网地址反正我是看半天了。官网地址

主要实现是在每列添加对应的表单控件使用受控组件来实现 <Input value={text} onChange={(e) => handleFieldChange(e, 'paramName', index) } 改变当前表格数据来实现数据的改变

js 复制代码
const [dataSource, setDataSource] = useState<any[]>([])
// 获取表格行数据
 const getRowByKey = (key, newData) => {
   return (newData || dataSource)[key];
 }
 // 改变表格数据
 const handleFieldChange = (e, fileName, key) => {
   const newData = [...dataSource];
   const target = getRowByKey(key, newData);
   if (target) {
     target[fileName] = e.target.value || e.target.checked;
     setDataSource(newData);
   }
 }

 // 新增
 const addData = () => {
   setDataSource([...dataSource, { 
     paramName: "",
     paramDesc: "",
     paramType: "",
     sampleItem: "",
     mandatory: true,
     requiredFlag: 1);
 };
// 删除
 const handleRemove = (index) => {
   const newData = [...dataSource];
   newData.splice(index, 1);
   setDataSource(newData);
 }
const columns: any[] = [
    {
      title: '序号',
      dataIndex: 'key',
      align: 'center',
      width: 70,
      render: (_, __, index) => index + 1
    },
    {
      title: '参数名',
      align: 'center',
      dataIndex: 'paramName',
      minWidth: 100,
      render: (text, record, index) => {
        return <Input value={text} onChange={(e) => handleFieldChange(e, 'paramName', index) } />
      }
    },
    {
      title: '描述',
      align: 'center',
      dataIndex: 'paramDesc',
      minWidth: 100,
      render: (text, record, index) => {
        return <Input value={text} onChange={(e) => handleFieldChange(e, 'paramDesc', index) } />
      }
    },
    {
      title: '数据类型',
      align: 'center',
      dataIndex: 'paramType',
      minWidth: 100,
      render: (text, record, index) => {
        return <Input value={text} onChange={(e) => handleFieldChange(e, 'paramType', index) } />
      }
    },
    {
      title: '示例值',
      align: 'center',
      dataIndex: 'sampleItem',
      minWidth: 100,
      render: (text, record, index) => {
        return <Input value={text} onChange={(e) => handleFieldChange(e, 'sampleItem', index) } />
      }
    },
    {
      title: '校验',
      align: 'center',
      dataIndex: 'mandatory',
      minWidth: 100,
      render: (text, record, index) => {
        return <Space>
            <Checkbox checked={text} onChange={(e) => handleFieldChange(e, 'mandatory', index)} />
            <Button type="link" onClick={() => handleSetRule()}>高级规则</Button>  
        </Space>
      }
    },
    {
      title: '操作',
      align: 'center',
      minWidth: 100,
      fixed: 'right',
      render: (_, record, index) => (
        <Space>
          <Button type="link" onClick={() => addData()} >追加</Button>
          <Button type="link" danger onClick={() => handleRemove(index)}>删除</Button>
        </Space>  
      )
    }
  ]
  
<Table
    style={{ width: '100%' }}
    rowKey="key"
    columns={columns}
    dataSource={dataSource} // 从表单中获取行数据
    pagination={false} // 关闭分页(如需分页需额外处理)
  />
相关推荐
橙序员小站2 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
炫饭第一名5 小时前
速通Canvas指北🦮——基础入门篇
前端·javascript·程序员
王晓枫5 小时前
flutter接入三方库运行报错:Error running pod install
前端·flutter
符方昊5 小时前
React 19 对比 React 16 新特性解析
前端·react.js
ssshooter5 小时前
又被 Safari 差异坑了:textContent 拿到的值居然没换行?
前端
曲折5 小时前
Cesium-气象要素PNG色斑图叠加
前端·cesium
Forever7_5 小时前
Electron 淘汰!新的桌面端框架 更强大、更轻量化
前端·vue.js
不会敲代码15 小时前
前端组件化样式隔离实战:React CSS Modules、styled-components 与 Vue scoped 对比
css·vue.js·react.js
Angelial5 小时前
Vue3 嵌套路由 KeepAlive:动态缓存与反向配置方案
前端·vue.js
jiayu6 小时前
Angular学习笔记24:Angular 响应式表单 FormArray 与 FormGroup 相互嵌套
前端