react 中 `ondrop` 事件不触发,通常是因为缺少 `ondragover` 事件处理器——该事件必须被显式阻止默认行为(`e.preventdefault()`),否则浏览器会拒绝执行 drop 操作。
在原生 HTML 拖放 API 中, 等非表单/非可编辑元素默认不接受拖放目标。即使你绑定了 onDrop,若未同时处理 onDragOver 并调用 e.preventDefault(),浏览器会沿用默认行为(如打开文件、导航跳转等),导致 drop 事件根本不会触发。 你的代码中已正确设置了 onDragStart、onDragEnter、onDragLeave 和 onDrop,但缺失关键的 onDragOver 处理器。只需为每个可投放的容器(即 TODO 和 COMPLETED 列)添加 onDragOver={(e) => e.preventDefault()} 即可激活 onDrop。 以下是修复后的核心修改(仅展示需变更的部分): ⚠️ 注意事项: ✅ 总结: 无需任何第三方库,纯 React + 原生 API 即可实现健壮的拖放交互。
TODO
{cards
.filter((c) => c.list === 'TODO')
.map((card) => (
handleDragStart(e, car
d.id)}
onDragEnter={() => handleDragEnter(card.id)}
onDragLeave={handleDragLeave}
onDragOver={(e) => e.preventDefault()} // ✅ 必须添加!
onDrop={(e) => handleDrop(e, 'TODO')}
>
{card.title}
))}
COMPLETED
{cards
.filter((c) => c.list === 'COMPLETED')
.map((card) => (
handleDragStart(e, card.id)}
onDragEnter={() => handleDragEnter(card.id)}
onDragLeave={handleDragLeave}
onDragOver={(e) => e.preventDefault()} // ✅ 同样必须添加!
onDrop={(e) => handleDrop(e, 'COMPLETED')}
>
{card.title}
))}
React 的拖放不是“开箱即用”,它严格遵循原生 DOM 规范。牢记三要素:








