You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中如何实现静态HTML表格列的拖拽排序?

表格列拖拽排序:React静态表格写法失效问题

我想要实现表格列的拖拽排序功能,试过多个库后写出了如下基于动态columns的React表格拖拽代码,该代码可正常运行:

import React, { useState } from 'react';
import './list_de_tournees.css'
const Table = ({ columns }) => {
  const [currentColumns, setCurrentColumns] = useState(columns);

  const handleDragStart = (e, columnIndex) => {
    e.dataTransfer.setData('columnIndex', columnIndex);
  };

  const handleDragOver = (e, columnIndex) => {
    e.preventDefault();
    const dragIndex = e.dataTransfer.getData('columnIndex');
    if (dragIndex !== columnIndex) {
      const newColumns = [...currentColumns];
      const [draggedColumn] = newColumns.splice(dragIndex, 1);
      newColumns.splice(columnIndex, 0, draggedColumn);
      setCurrentColumns(newColumns);
    }
  };

  return (
    <table>
      <thead>
        <tr>
          {currentColumns.map((column, index) => (
            <th
              key={column.id}
              draggable
              onDragStart={(e) => handleDragStart(e, index)}
              onDragOver={(e) => handleDragOver(e, index)}
            >
              {column.Header}
            </th>
          ))}
        </tr>
      </thead>
      <tbody>
        <tr>
          {currentColumns.map((column, index) => (
            <td key={column.id}>
              {column.accessor === 'name' && 'alice'}
              {column.accessor === 'age' && '30'}
              {column.accessor === 'country' && 'USA'}
            </td>
          ))}
        </tr>
        <tr>
          {currentColumns.map((column, index) => (
            <td key={column.id}>
              {column.accessor === 'name' && 'Bob'}
              {column.accessor === 'age' && '25'}
              {column.accessor === 'country' && 'Canada'}
            </td>
          ))}
        </tr>
        <tr>
          {currentColumns.map((column, index) => (
            <td key={column.id}>
              {column.accessor === 'name' && 'Charlie'}
              {column.accessor === 'age' && '35'}
              {column.accessor === 'country' && 'UK'}
            </td>
          ))}
        </tr>
      </tbody>
    </table>
  );
};

const columns = [
  {
    Header: 'Name',
    accessor: 'name',
    id: '1',
  },
  {
    Header: 'Age',
    accessor: 'age',
    id: '2',
  },
  {
    Header: 'Country',
    accessor: 'country',
    id: '3',
  },
];

function App() {
  return (
    <div className="App">
      <Table columns={columns} />
    </div>
  );
}

export default App;

但我希望改成静态HTML表格并保留拖拽功能,于是尝试了如下写法,却无法实现拖拽效果:

<td draggable onDragStart={(e) => handleDragStart(e, 0)} onDragOver={(e) => handleDragOver(e, 0)}>Alice</td>
<td draggable onDragStart={(e) => handleDragStart(e, 1)} onDragOver={(e) => handleDragOver(e, 1)}>30</td>
<td draggable onDragStart={(e) => handleDragStart(e, 2)} onDragOver={(e) => handleDragOver(e, 2)}>USA</td>

相同的拖拽逻辑在纯HTML、CSS和原生JS环境中可以正常运行。

内容的提问来源于stack exchange,提问作者the_yaz2000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:58:10