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

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

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

react如何实现表格列拖动

分享给朋友:

相关文章

vue如何实现目录组件

vue如何实现目录组件

实现目录组件的基本思路 在Vue中实现目录组件通常需要结合页面内容的结构化数据(如标题层级),通过动态渲染生成可交互的目录。核心步骤包括提取标题、生成目录结构、实现滚动联动等。 提取标题信息 通过…

h5如何实现定位

h5如何实现定位

使用HTML5 Geolocation API HTML5提供了Geolocation API,可以获取用户的地理位置信息。通过navigator.geolocation对象实现,支持获取经纬度、海拔…

vue如何实现重新实现主题

vue如何实现重新实现主题

Vue 主题切换的实现方法 使用 CSS 变量动态切换主题 定义主题相关的 CSS 变量,通过修改这些变量实现主题切换。在根元素(如 :root)中定义默认主题的变量,在特定类名下定义其他主题的变量。…

vue如何实现拖动

vue如何实现拖动

Vue 实现拖动的常用方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性和相关事件实现拖动功能。 <template>…

vue如何实现mvvm

vue如何实现mvvm

Vue 的 MVVM 实现原理 Vue 通过数据绑定和响应式系统实现 MVVM(Model-View-ViewModel)模式。其核心在于将数据模型(Model)与视图(View)通过 ViewMod…

vue项目如何实现

vue项目如何实现

安装Vue.js 通过npm或yarn安装Vue.js。确保Node.js环境已配置完成。 npm install vue # 或 yarn add vue 创建Vue项目 使用Vue CLI工具快…