antd table表格支持多选框选择当前列,进行格式设置等

项目中遇到一个需求,要求可以选择当前列,对当前列数据进行格式设置等,发现官方文档都不支持,于是自己封装了一下antd table组件

import { Checkbox, Table } from "antd";
import React, { useEffect, useState } from "react";

const MultipleMultipleTables = (props) => {
  /**
   * Array- dataList 表格数据
   * Object- checkAllList 多选字段全选
   * String- showField   需要展示的字段 字符串 使用 空格 隔开
   * Object- checkAllTitle 多选字段名称表头 不传 为空 对应 showField 表头
   * func-  onChangeTableList 事件  返回 当前改变的数据
   * Boolean -  showHeader 属性 是否显示表头
   * Boolean - pagination 属性 是否加载分页器
   * String- columnWidth 属性 列宽
   */
  const {
    dataList,
    checkAllList,
    showField,
    checkAllTitle,
    onChangeTableList,
    showHeader,
    pagination,
    columnWidth,
  } = props;

  let columns = []

  //全选 必须对应 表格内容数据的
  const [checkAll, setCheckAll] = useState(checkAllList),
    //表格数据
    [myColumns, setMycolumns] = useState([]);


  //监听数据变化
  useEffect(() => {
    console.log(11111111111111)
    //每次有效操作会传递给父组件
    // if (onChangeTableList) onChangeTableList(columns);
  }, [dataList, myColumns]); // eslint-disable-line

  //全选 必须对应 表格内容数据的 类型状态多选字段  生成 columns
  const columnsFun = () => {
    // console.log('field===========', showField)
    if (!showField) return;
    const columns1 = [];
    const field = showField.split(" ");
    field.forEach((item, index) => {
      console.log('Object.keys(checkAll)',item)
      let multiple = {
        title: () => { // 设置标题复选框
          return (
            <Checkbox
              onChange={() => onCheckAllChange(item)}
              checked={checkAll[item]}
              key={`${item}${index}`}
            >
              {checkAllTitle[item] || ""}
            </Checkbox>
          );
        },
        dataIndex: item,
        width: columnWidth,
        // align: 'center',
        render: (text, record, index) => {
          return (
            <div key={`${text}${index}`}>
              {record[item]}
            </div>
          );
        },
      };
      columns1.push(multiple);

    });
    return columns1;
  };
  columns = columnsFun();
 



  /**
   * @description: 
   * @param {any} e 事件 获取当前选择的状态
   * @param {any} recordAndType 当前数据或者选择类型
   * @param {any} type 类型
   * @return {*}
   */
  const onCheckAllChange = (recordAndType) => {
    Object.keys(checkAll).forEach(key => { // 遍历标题全选对象,当前选项设反,其余选项全部取消勾选

      if (key === recordAndType) {
        checkAll[recordAndType] = !checkAll[recordAndType] // 当前列选择状态
      } else {
        checkAll[key] = false // 每次只能选择一列,所以把其他列取消选择
      }
    })
    
    columns = columnsFun()
   
    setCheckAll(checkAll) // 重新设置标题选项组
    setMycolumns(columns) // 设置列
    console.log('recordAndType', checkAll[recordAndType])

    if (checkAll[recordAndType]) {
      onChangeTableList(recordAndType) // 回传当前列
    } else {
      onChangeTableList('') // 回传空值 
    }

  };

  return (
    <>
      <Table
        columns={columns}
        dataSource={dataList}
        showHeader={showHeader}
        pagination={pagination}
        scroll={{
          x: dataList.length > 0 ? columns.length * 110 : false,
          y: dataList.length > 0 ? 315 : false,
        }}
      />
    </>
  );
};

export default MultipleMultipleTables;

使用的时候直接导入使用就好啦~

 <TablesMultiple
                      dataList={dataSource}
                      showField={showField}
                      checkAllList={checkAllList}
                      checkAllTitle={checkAllTitle}
                      onChangeTableList={onChangeTableList}
                      showHeader={true}
                      pagination={false}
                      columnWidth={100}>
                    </TablesMultiple>

然后我们要处理一下这个checkAllLilst和checkAllTitle赋值

  // 设置表格数据
  const handleFormData = (data) => {
    console.log('dhandleFormDatahand', data)
    let { columns, tableData } = data;
    setColumnsArr(columns);
    let showFiled = ''
    let allList = {} // 多选字段全选 
    let allTitle = {} //  多选字段名称表头
    const myColumns = columns.map((item, index) => {
      if (index < columns.length - 1) {
        showFiled = showFiled + item + ' ' // 需要展示的字段,用以判断是否要展示,这里做了拓展,我们可以利用这个属性设置当前列不可选择
      } else {
        showFiled = showFiled + item
      }
      allList[item] = false
      allTitle[item] = item

      return {
        title: item,
        dataIndex: item,
        key: item,
      };
    });
    let source = tableData.map((item, index) => {
      let obj = {};
      obj.key = index;
      myColumns.forEach((ele, ind) => {
        obj[`${ele.title}`] = item[ind];
      });
      return obj;
    });

    console.log('设置后的数据', showFiled, allList, allTitle)
    setShowFiled(showFiled)
    setCheckAllList(allList)
    setCheckAllTitle(allTitle)
    setColumns(myColumns);
    setDataSource(source);

  };

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Ant Design 的 Table 组件中,可以通过 `rowSelection` 属性来添加多选框。如果需要合并单元格,可以通过设置 `rowSpan` 和 `colSpan` 来实现。 以下是一个示例代码: ```jsx import { Table } from 'antd'; const data = [ { key: '1', name: 'John Brown', age: 32, address: 'New York No. 1 Lake Park' }, { key: '2', name: 'Jim Green', age: 42, address: 'London No. 1 Lake Park' }, { key: '3', name: 'Joe Black', age: 32, address: 'Sidney No. 1 Lake Park' }, { key: '4', name: 'Jim Red', age: 32, address: 'London No. 2 Lake Park' } ]; const columns = [ { title: 'Name', dataIndex: 'name', key: 'name', colSpan: 2, // 合并两列 render: (text, record, index) => { const obj = { children: text, props: {} }; if (index === 0) { obj.props.rowSpan = 2; // 合并两行 } if (index === 2) { obj.props.rowSpan = 0; // 不渲染 } return obj; } }, { title: 'Age', dataIndex: 'age', key: 'age', colSpan: 0, // 不渲染 render: (text, record, index) => { const obj = { children: text, props: {} }; if (index === 0) { obj.props.rowSpan = 2; // 合并两行 } if (index === 2) { obj.props.rowSpan = 0; // 不渲染 } return obj; } }, { title: 'Address', dataIndex: 'address', key: 'address' } ]; function onChange(selectedRowKeys, selectedRows) { console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows); } <Table rowSelection={{ type: 'checkbox', onChange: onChange }} columns={columns} dataSource={data} />; ``` 在这个示例中,我们通过 `colSpan` 和 `rowSpan` 来实现了单元格的合并。注意,由于合并单元格后表格结构变得复杂,需要通过 `render` 方法来渲染单元格内容。同时,多选框的处理与普通表格一样,通过 `rowSelection` 属性来实现。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值