react antd实现一个树级的可编辑表格,并且可以合并表头

简述

最近公司有个新需求,需要做一个树级的可编辑表格,并且可以合并表头。我尼玛,这么复杂的可编辑表格杂整啊。
大概就是下面图类似的,第一行是树级结构,后面都是可以编辑的
在这里插入图片描述

实现

选择的技术方案:在antd的基础上封装(因为antd 的Table组件支持树级显示,也支持合并表头,)

1、antd Table的前置知识

Table的dataSource属性会把里面有嵌套的数据拍平

const data = [
{
    name:"父级",
    children:[
    {name:"子级1"},
    {name:"子级2"},
    ]
    }
]

antd里面最后使用会变成
const flattenData = [
{name:"父级"},  
{name:"子级1"},
{name:"子级2"},
]

Table源码

Table的columns属性会把里面有嵌套的数据弄成二维数组

const columns=[
    {
      title: '建设任务',
      dataIndex: 'name',
    },
    {
      title: '到位金额',
          children:[
            {
              title: '合计q填报',
              dataIndex: 'total1',
              width: 220,
            },
            {
              title: '合计w填报',
              dataIndex: 'total2',
              width: 220,
            },
          ]
    },]
    
  const resultColumns = [
  [ {
      title: '建设任务',
      dataIndex: 'name',
    },
    {
      title: '到位金额',
      }
  ],[
  {
              title: '合计q填报',
              dataIndex: 'total1',
              width: 220,
            },
            {
              title: '合计w填报',
              dataIndex: 'total2',
              width: 220,
            },
  ]

Table处理columns源码

2、最简单的实现
const columns=[
    {
      title: '建设任务',
      dataIndex: 'name',
    },
    {
      title: '到位金额',
          children:[
            {
              title: '合计q填报',
              dataIndex: 'total1',
              width: 220,
              render: (value) => <Input value={value} />
            },
            {
              title: '合计w填报',
              dataIndex: 'total2',
              width: 220,
              render: (value) => <Input value={value} />
            },
          ]
    },]

这样好像行了,自己render,前面是树级,后面都是可以编辑的。但是这样每次都需要我们自己render,达不到封装的目的。好了,接下来我发现antd 的table 有一个components属性,我们可以自定每一行,每一列。

在这里插入图片描述

Table处理TableComponents源码

3、使用components自定义实现表格的行和列
const tdNewComponent = (
  props
) => {

  if (props?.column?.dataIndex === 'name') {
    return <td className={styles.td} {...props}></td>
  }
  return <td><Input/></td>
  
  }

<Table
dataSource={dataSource}
columns={processedColumns}
  components={{
              body: {
                cell: tdNewComponent,
              },
            }}
          />

这样使用自定单元格确实一次就解决了每次render的问题

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用React和Ant Design(antd)来实现一个可删除和增加的树级表格。下面是一个简单的示例代码: 首先,你需要安装React和Ant Design依赖: ``` npm install react antd ``` 然后,你可以创建一个名为"TreeTable.js"的组件,并导入所需的依赖: ```jsx import React, { useState } from 'react'; import { Table, Button } from 'antd'; const TreeTable = () => { const [data, setData] = useState([ { key: '1', name: 'John Brown', age: 32, children: [ { key: '1-1', name: 'Jim Green', age: 42, }, { key: '1-2', name: 'Joe Black', age: 32, }, ], }, { key: '2', name: 'John Brown', age: 32, children: [ { key: '2-1', name: 'Jim Green', age: 42, }, { key: '2-2', name: 'Joe Black', age: 32, }, ], }, ]); const columns = [ { title: 'Name', dataIndex: 'name', key: 'name', }, { title: 'Age', dataIndex: 'age', key: 'age', }, { title: 'Action', dataIndex: '', key: 'x', render: (_, record) => data.length > 1 ? ( <Button onClick={() => handleDelete(record.key)}>Delete</Button> ) : null, }, ]; const handleDelete = (key) => { const newData = data.filter((item) => item.key !== key); setData(newData); }; return <Table columns={columns} dataSource={data} pagination={false} />; }; export default TreeTable; ``` 在这个示例中,我们使用useState钩子来存储表格的数据。数据是一个包含树级结构的数组。每个节点都有一个唯一的"key"属性。我们使用Ant Design的Table组件来展示数据,并设置了一个包含删除按钮的列。 当点击删除按钮时,我们会调用handleDelete函数来过滤掉被删除节点的数据,并更新表格的状态。 你可以在你的应用程序中使用TreeTable组件来展示一个树级的可删除和增加的表格: ```jsx import React from 'react'; import TreeTable from './TreeTable'; const App = () => { return ( <div> <TreeTable /> </div> ); }; export default App; ``` 这只是一个简单的示例,你可以根据自己的需求进行修改和扩展。希望能帮助到你!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值