当前位置:首页 > React

react如何实现表格列拖动

2026-01-25 13:14:53React

实现表格列拖动的步骤

使用 React 实现表格列拖动功能,可以借助第三方库如 react-dndreact-beautiful-dnd。以下是具体实现方法:

使用 react-dnd 实现

安装 react-dndreact-dnd-html5-backend

npm install react-dnd react-dnd-html5-backend

创建一个可拖动的表格列组件:

import { useDrag, useDrop } from 'react-dnd';

const DraggableColumn = ({ id, index, moveColumn, children }) => {
  const [{ isDragging }, drag] = useDrag({
    type: 'COLUMN',
    item: { id, index },
    collect: (monitor) => ({
      isDragging: monitor.isDragging(),
    }),
  });

  const [, drop] = useDrop({
    accept: 'COLUMN',
    hover(item, monitor) {
      if (item.index === index) return;
      moveColumn(item.index, index);
      item.index = index;
    },
  });

  return (
    <div
      ref={(node) => drag(drop(node))}
      style={{ opacity: isDragging ? 0.5 : 1 }}
    >
      {children}
    </div>
  );
};

在表格组件中使用 DraggableColumn

const Table = ({ columns, data }) => {
  const [cols, setCols] = useState(columns);

  const moveColumn = (fromIndex, toIndex) => {
    const updatedCols = [...cols];
    const [movedCol] = updatedCols.splice(fromIndex, 1);
    updatedCols.splice(toIndex, 0, movedCol);
    setCols(updatedCols);
  };

  return (
    <table>
      <thead>
        <tr>
          {cols.map((col, index) => (
            <DraggableColumn
              key={col.id}
              id={col.id}
              index={index}
              moveColumn={moveColumn}
            >
              <th>{col.title}</th>
            </DraggableColumn>
          ))}
        </tr>
      </thead>
      <tbody>
        {data.map((row) => (
          <tr key={row.id}>
            {cols.map((col) => (
              <td key={col.id}>{row[col.dataKey]}</td>
            ))}
          </tr>
        ))}
      </tbody>
    </table>
  );
};

使用 react-beautiful-dnd 实现

安装 react-beautiful-dnd

npm install react-beautiful-dnd

实现拖拽表格列:

import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';

const Table = ({ columns, data }) => {
  const [cols, setCols] = useState(columns);

  const onDragEnd = (result) => {
    if (!result.destination) return;
    const updatedCols = [...cols];
    const [movedCol] = updatedCols.splice(result.source.index, 1);
    updatedCols.splice(result.destination.index, 0, movedCol);
    setCols(updatedCols);
  };

  return (
    <DragDropContext onDragEnd={onDragEnd}>
      <table>
        <thead>
          <Droppable droppableId="columns" direction="horizontal">
            {(provided) => (
              <tr ref={provided.innerRef} {...provided.droppableProps}>
                {cols.map((col, index) => (
                  <Draggable key={col.id} draggableId={col.id} index={index}>
                    {(provided) => (
                      <th
                        ref={provided.innerRef}
                        {...provided.draggableProps}
                        {...provided.dragHandleProps}
                      >
                        {col.title}
                      </th>
                    )}
                  </Draggable>
                ))}
                {provided.placeholder}
              </tr>
            )}
          </Droppable>
        </thead>
        <tbody>
          {data.map((row) => (
            <tr key={row.id}>
              {cols.map((col) => (
                <td key={col.id}>{row[col.dataKey]}</td>
              ))}
            </tr>
          ))}
        </tbody>
      </table>
    </DragDropContext>
  );
};

注意事项

  • 确保为每个可拖动的列分配唯一的 id

  • 拖拽操作完成后更新列的顺序状态。

  • 使用 react-dnd 时需包裹应用在 DndProvider 中:

    react如何实现表格列拖动

    import { DndProvider } from 'react-dnd';
    import { HTML5Backend } from 'react-dnd-html5-backend';
    
    const App = () => (
      <DndProvider backend={HTML5Backend}>
        <Table columns={columns} data={data} />
      </DndProvider>
    );

以上方法提供了两种实现表格列拖动的方案,可根据项目需求选择合适的库。

分享给朋友:

相关文章

vue如何实现两栏布局

vue如何实现两栏布局

使用 Flexbox 实现两栏布局 通过 Flexbox 可以快速实现两栏布局,适合现代浏览器。在 Vue 的模板中,使用 display: flex 和 flex 属性控制两栏的宽度比例。 <…

vue如何实现单选

vue如何实现单选

Vue 实现单选的方法 在 Vue 中实现单选功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 v-model 绑定单选按钮 通过 v-model 绑定到同一个变量,确保同一时间只有一个选…

vue如何实现冒泡

vue如何实现冒泡

Vue 实现冒泡排序的步骤 在 Vue 中实现冒泡排序,可以通过数据绑定和计算属性来动态展示排序过程。以下是一个完整的实现示例。 示例代码 <template> <div>…

vue手写签名如何实现

vue手写签名如何实现

实现 Vue 手写签名的步骤 使用 canvas 实现基础签名功能 在 Vue 项目中创建一个组件,利用 HTML5 的 canvas 元素实现手写签名功能。通过监听鼠标或触摸事件来捕获用户的绘制路径…

h5如何实现vr效果

h5如何实现vr效果

使用WebXR API实现VR效果 WebXR是浏览器中实现VR/AR的核心API,支持设备姿态追踪、渲染交互等功能。需在支持WebXR的设备(如Oculus、HTC Vive)或浏览器模拟环境中运行…

前段vue如何实现

前段vue如何实现

Vue 前端实现方法 Vue 是一款流行的前端框架,用于构建用户界面。以下是一些常见的 Vue 实现方法: 组件化开发 Vue 的核心思想是组件化开发。每个组件可以独立封装逻辑、模板和样式,便于复用…