概述
在React项目中实现列表卡片的拖拽排序功能(Drag-and-Drop Sorting
),需要选择一个适合的库来处理交互、性能、可访问性和兼容性。dnd-kit
是一个现代的选择,但我们需要结合类似库进行比较,包括react-beautiful-dnd、react-dnd、react-sortable-hoc和sortablejs(通过React wrapper集成)
。这些库主要聚焦于将列表项转为可拖拽、可排序的组件,支持触摸、键盘和动画等。

基于2025年的最新信息,许多库已演变:react-beautiful-dnd
已弃用,转向Atlassian的Pragmatic Drag and Drop
;react-sortable-hoc
维护有限,推荐迁移到dnd-kit
;react-dnd
和dnd-kit
仍活跃。sortablejs
是纯JS库,可灵活集成,但可访问性较弱。以下是全面分析,包括关键特点、优缺点和比较。
选型时考虑因素:项目复杂度(简单列表 vs. 复杂交互)、维护状态、可访问性、性能和社区支持等。
关键实现原理
监听用户输入事件(如鼠标、触摸或键盘),计算拖拽位置,更新状态,并提供视觉反馈(如动画和占位符)。
它们通常避免直接依赖浏览器原生的HTML5 Drag and Drop API
(因其跨浏览器不一致性和可访问性问题),而是使用自定义事件处理和React状态管理来实现更可靠的交互。
核心机制包括:
- 事件监听与传感器 :捕获
pointer/mouse/touch
事件,检测拖拽开始、移动和结束。 - 碰撞检测:计算拖拽项与目标区域的交集,确定新位置。
- 状态管理 :使用
React hooks
或高阶组件(HOC)跟踪拖拽状态,更新数据源(如数组索引)。 - 视觉与动画 :通过CSS变换、克隆元素(ghost)或
requestAnimationFrame
实现平滑移动。 - 可访问性:添加ARIA属性和键盘导航支持。
- 性能优化:结合虚拟化渲染、节流事件来处理大型列表。
库比较
(数据基于GitHub活跃度、文档和2025年比较文章)
1. dnd-kit

1. 关键特点
- hook based,模块化设计。
- 支持列表、网格、树、2D 游戏等。
- 内置传感器(鼠标、触摸、键盘)。
- 自动滚动、碰撞检测。
- 示例:使用和包裹列表,实现排序。
2. 优点
- 轻量级(~10KB minified)。
- 高性能,可快速支持虚拟滚动(verticalListSortingStrategy),少重渲染。
- 优秀可访问性(ARIA 支持、键盘导航)。
- 易扩展,自定义行为。
- 社区活跃,有详细文档和storybook示例。
3. 缺点
- 学习曲线中等(需理解传感器和修改器)。
4. 与dnd-kit的比较
N/A(基准)。
5. 流行度(2025年下载趋势)
高(npm trends显示超过react-beautiful-dnd)
6. 维护状态
活跃(最后更新2025年,issue响应快)
2. react-dnd

1. 关键特点
- 基于 HTML5 API,低级原语。
- 支持自定义拖拽预览、下拉目标、复杂交互(如棋盘)。
- 示例:使用和backend(如 HTML5Backend)。
2. 优点
- 高度可定制,适合非列表场景。
- 支持多后端(触摸等)。
- 稳定,处理复杂逻辑好。
3. 缺点
- API 复杂,学习曲线陡。
- 需要更多样板代码。
- 可访问性需手动增强。
4. 与dnd-kit的比较
- dnd-kit 更轻量、专注 React hook;react-dnd 更通用,但 dnd-kit 在排序性能上胜出。
- dnd-kit 更适合简单列表,react-dnd 适合自定义重。
5. 流行度(2025年下载趋势)
高(稳定,npm trends与dnd-kit相当)。
6. 维护状态
活跃(文档更新到2025年)。
3. Pragmatic Drag and Drop

1. 关键特点
- react-beautiful-dnd 继任者。
- 支持列表、多拖拽、自定义。
- 示例:类似 react-beautiful-dnd,但更模块化。
2. 优点
- 继承美观动画。
- 强可访问性。
- 性能优化。
3. 缺点
- 较新,社区较小。
- 文档仍在完善。
4. 与dnd-kit的比较
- dnd-kit 更轻量、开源社区大;Pragmatic 更专注 Atlassian 生态。
- 如果从 react-beautiful-dnd 迁移,Pragmatic 更直接。
5. 流行度(2025年下载趋势)
上升(2025年新流行)。
6. 维护状态
活跃(Atlassian维护)。
4. sortablejs (with react-sortablejs wrapper)
1. 关键特点
- 纯 JS 库,React wrapper 提供绑定。
- 支持嵌套列表、多框架。
- 示例:使用 ReactSortable 组件,配置动画和事件。
2. 优点
- 高性能,轻量级(无依赖)。
- 广泛自定义(交换、动画)。
- 支持旧浏览器 fallback。
3. 缺点
- 可访问性弱(无内置键盘 / ARIA,需手动)。
- Wrapper 维护不活跃。
- 集成 React 需额外工作。
4. 与dnd-kit的比较
- dnd-kit 更 React-native,内置可访问性;sortablejs 更通用,但 dnd-kit 在 React 性能上优。
- 如果非 React 项目,sortablejs 更好。
5. 流行度(2025年下载趋势)
高(纯JS流行)。
6. 维护状态
活跃(核心库更新,wrapper中等)。
技术选型建议
推荐首选:dnd-kit
- 为什么?它平衡了易用性、性能和维护 ,是2025年React拖拽排序的顶级选择(Puck Editor和Reddit讨论中多次推荐)。适合列表卡片场景:用和hook,几行代码即可实现排序。支持触摸/键盘,无需额外配置。antd生态推荐使用~ - 何时选择:项目中等复杂度,需要可访问性和未来-proof。 - 起步:安装@dnd-kit/core和@dnd-kit/sortable,参考docs.dndkit.com/的Sortable Preset。
备选1:react-dnd
- 为什么?如果你的项目可能扩展到更复杂交互(如卡片到不同区域拖拽),它的自定义能力强。但对于纯排序,dnd-kit更高效。
- 何时选择:需要低级控制,或已有HTML5经验。
备选2:Pragmatic Drag and Drop
- 为什么?如果喜欢react-beautiful-dnd的风格,这是官方继任者。2025年文章(如LogRocket)赞其特征丰富。
- 何时选择:Atlassian生态,或从旧库迁移。检查github.com/atlassian/p...
避免:react-beautiful-dnd和react-sortable-hoc
-
弃用/维护有限,会带来风险(如React版本兼容)。
-
其他考虑
- 可访问性:优先dnd-kit或Pragmatic(内置ARIA)。sortablejs需手动添加。
- 性能:大型列表用dnd-kit或react-dnd的虚拟化支持。
- 迁移:如果未来需求变化,dnd-kit的模块化易扩展。
希望对你有所帮助~
