
react 中 `ondrop` 事件不触发,通常是因为缺少 `ondragover` 事件处理器——该事件必须被显式阻止默认行为(`e.preventdefault()`),否则浏览器会拒绝执行 drop 操作。
在原生 HTML 拖放 API 中, 你的代码中已正确设置了 onDragStart、onDragEnter、onDragLeave 和 onDrop,但缺失关键的 onDragOver 处理器。只需为每个可投放的容器(即 TODO 和 COMPLETED 列)添加 onDragOver={(e) => e.preventDefault()} 即可激活 onDrop。 以下是修复后的核心修改(仅展示需变更的部分): 生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力:
- 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面;
- 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”;
- 提及位于 `apps/console/src/featur ⚠️ 注意事项: ✅ 总结: 无需任何第三方库,纯 React + 原生 API 即可实现健壮的拖放交互。
<div className="list todo">
<h2>TODO</h2>
{cards
.filter((c) => c.list === 'TODO')
.map((card) => (
<div
key={card.id}
className="card"
draggable={true}
onDragStart={(e) => handleDragStart(e, card.id)}
onDragEnter={() => handleDragEnter(card.id)}
onDragLeave={handleDragLeave}
onDragOver={(e) => e.preventDefault()} // ✅ 必须添加!
onDrop={(e) => handleDrop(e, 'TODO')}
>
{card.title}
</div>
))}
</div>
<div className="list completed">
<h2>COMPLETED</h2>
{cards
.filter((c) => c.list === 'COMPLETED')
.map((card) => (
<div
key={card.id}
className="card"
draggable={true}
onDragStart={(e) => handleDragStart(e, card.id)}
onDragEnter={() => handleDragEnter(card.id)}
onDragLeave={handleDragLeave}
onDragOver={(e) => e.preventDefault()} // ✅ 同样必须添加!
onDrop={(e) => handleDrop(e, 'COMPLETED')}
>
{card.title}
</div>
))}
</div>
React 的拖放不是“开箱即用”,它严格遵循原生 DOM 规范。牢记三要素:

















