返回

利用 React Hooks 实现自定义表格列,拖拽排序、自定义列显示隐藏轻松搞定!

前端

在进行数据展示时,表格无疑是最常见的组件。作为前端工程师,我们需要经常与表格打交道。而 React Hooks 的出现,为我们提供了另一种编写表格组件的方法,不仅更加简洁,而且更加灵活。

借助 React Hooks,我们可以实现表格列的拖拽排序,并自定义列的显示隐藏。当外部传入的 columns 发生变化时,我们可以通过函数式组件和回调函数来控制 CustomColumnTable 组件的内部状态,实现动态的表格列变化。

除了拖拽排序和自定义列显示隐藏外,我们还可以通过自定义列的宽度、对齐方式、渲染函数等属性,来实现更加个性化的表格展示效果。

让我们具体了解一下如何使用 React Hooks 来实现这些功能。

拖拽排序

为了实现拖拽排序,我们需要引入 react-dnd 库。该库提供了拖放功能的实现,我们可以直接将其应用于表格列。

首先,我们需要在表格列上添加一个拖拽手柄。我们可以使用 Draggable 组件来实现这一点。Draggable 组件接收一个 onDragStart 函数,该函数会在拖动开始时触发,并返回一个 dragItem 对象。

const DraggableColumn = ({ column }) => {
  const ref = React.useRef(null);

  const onDragStart = (e) => {
    e.dataTransfer.setData("column", JSON.stringify(column));
  };

  return (
    <Draggable draggableId={column.id} ref={ref} onDragStart={onDragStart}>
      <div className="column-header">{column.title}</div>
    </Draggable>
  );
};

接下来,我们需要创建一个 Droppable 组件来接收拖拽的表格列。Droppable 组件接收一个 onDrop 函数,该函数会在拖动结束时触发,并返回一个 dropItem 对象。

const DroppableColumn = ({ onDrop }) => {
  const ref = React.useRef(null);

  const onDrop = (e) => {
    const column = JSON.parse(e.dataTransfer.getData("column"));
    onDrop(column);
  };

  return (
    <Droppable droppableId="columns" ref={ref} onDrop={onDrop}>
      <div className="column-list"></div>
    </Droppable>
  );
};

最后,我们需要将 DraggableColumnDroppableColumn 组件组合在一起,并将其应用于表格组件。

const CustomColumnTable = () => {
  const [columns, setColumns] = React.useState([
    { id: "name", title: "姓名" },
    { id: "age", title: "年龄" },
    { id: "city", title: "城市" },
  ]);

  const onDrop = (column) => {
    const newColumns = [...columns];
    const index = columns.findIndex((c) => c.id === column.id);
    newColumns.splice(index, 1);
    setColumns(newColumns);
  };

  return (
    <div className="table-container">
      <DroppableColumn onDrop={onDrop} />
      <DraggableColumn column={columns[0]} />
      <DraggableColumn column={columns[1]} />
      <DraggableColumn column={columns[2]} />
    </div>
  );
};

自定义列显示隐藏

为了实现自定义列的显示隐藏,我们需要使用 useState Hook 来维护表格列的状态。

const CustomColumnTable = () => {
  const [columns, setColumns] = React.useState([
    { id: "name", title: "姓名", visible: true },
    { id: "age", title: "年龄", visible: true },
    { id: "city", title: "城市", visible: true },
  ]);

  const toggleColumnVisibility = (columnId) => {
    const newColumns = [...columns];
    const index = columns.findIndex((c) => c.id === columnId);
    newColumns[index].visible = !newColumns[index].visible;
    setColumns(newColumns);
  };

  return (
    <div className="table-container">
      <div className="column-list">
        {columns.map((column) => (
          <div key={column.id} className="column">
            <input type="checkbox" checked={column.visible} onChange={() => toggleColumnVisibility(column.id)} />
            <label>{column.title}</label>
          </div>
        ))}
      </div>
      <Table columns={columns.filter((c) => c.visible)} dataSource={data} />
    </div>
  );
};

更多自定义选项

除了拖拽排序和自定义列显示隐藏外,我们还可以通过自定义列的宽度、对齐方式、渲染函数等属性,来实现更加个性化的表格展示效果。

const CustomColumnTable = () => {
  const [columns, setColumns] = React.useState([
    { id: "name", title: "姓名", width: 100, align: "center", render: (value) => <div>{value}</div> },
    { id: "age", title: "年龄", width: 80, align: "center", render: (value) => <div>{value}</div> },
    { id: "city", title: "城市", width: 120, align: "left", render: (value) => <div>{value}</div> },
  ]);

  return (
    <div className="table-container">
      <Table columns={columns} dataSource={data} />
    </div>
  );
};

结语

通过使用 React Hooks,我们可以轻松实现表格列的拖拽排序、自定义列的显示隐藏以及其他更加个性化的表格展示效果。希望本文能够帮助您更好地掌握 React Hooks 的用法,并将其应用于您的项目中。