当前位置:首页 > 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

react如何实现表格列拖动

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

实现拖拽表格列:

react如何实现表格列拖动

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 中:

    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如何实现冒泡

Vue 实现冒泡排序 在 Vue 中实现冒泡排序,可以通过数据绑定和响应式特性动态展示排序过程。以下是一个完整的实现示例,包含代码和详细说明。 数据准备 在 Vue 的 data 中定义一个数组作…

vue如何实现重新实现主题

vue如何实现重新实现主题

动态主题切换的实现 在Vue中实现动态主题切换,通常需要结合CSS变量和状态管理。通过修改根元素的CSS变量值,可以全局改变应用的主题样式。 定义主题相关的CSS变量在根元素中: :root…

vue自动登录如何实现

vue自动登录如何实现

实现自动登录的基本思路 自动登录通常通过结合本地存储(如localStorage或cookie)和token验证机制实现。用户首次登录成功后,服务器返回的认证token会被保存在客户端,下次打开应用时…

如何实现vue表格联动

如何实现vue表格联动

实现 Vue 表格联动的方法 数据绑定与响应式更新 通过 Vue 的响应式特性,将多个表格的数据绑定到同一个数据源或计算属性。当一个表格的数据发生变化时,另一个表格会自动更新。例如: data()…

vue怎么实现拖动数据

vue怎么实现拖动数据

实现拖动数据的基本方法 在Vue中实现拖动数据通常使用HTML5的拖放API或第三方库如vuedraggable。以下是两种常见方法的详细说明: 使用HTML5原生拖放API HTML5提供了dra…

vue如何实现默认页面

vue如何实现默认页面

Vue 实现默认页面的方法 在 Vue 项目中,通常需要设置一个默认页面(如首页或登录页)作为用户访问时的初始页面。可以通过路由配置实现。 配置路由默认跳转 在 Vue Router 中,使用 r…