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

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

分享给朋友:

相关文章

h5页面如何实现

h5页面如何实现

实现H5页面的方法 H5页面是基于HTML5技术的网页,通常用于移动端和响应式设计。以下是实现H5页面的关键步骤和技术要点。 基础结构 使用HTML5的DOCTYPE声明作为页面的起始。HTML5简…

vue如何实现图

vue如何实现图

Vue 实现图表的方法 Vue 中实现图表可以通过多种方式,常见的有使用第三方库或自定义实现。以下是几种常见的方法: 使用 ECharts ECharts 是一个功能强大的图表库,支持多种图表类型。…

js实现图片拖动

js实现图片拖动

实现图片拖动的步骤 使用JavaScript实现图片拖动功能,可以通过HTML5的拖放API结合事件监听实现。以下是具体方法: 设置HTML结构 为图片添加draggable属性,并设置唯一ID以便…

vue如何实现刷新

vue如何实现刷新

实现页面刷新的方法 在Vue中实现刷新功能可以通过以下几种方式实现: 使用location.reload() 直接调用浏览器的原生方法强制刷新整个页面: methods: { refreshP…

vue如何实现搜索

vue如何实现搜索

实现搜索功能的基本思路 在Vue中实现搜索功能通常涉及以下几个核心步骤:监听用户输入、过滤数据、动态渲染结果。以下是具体实现方法。 监听用户输入 使用v-model双向绑定搜索框的输入值,监听用户输…

vue如何实现tab

vue如何实现tab

Vue实现Tab功能的几种方法 使用动态组件和v-if/v-show 通过v-if或v-show控制不同内容的显示隐藏,结合点击事件切换当前激活的Tab。 <template> &l…