
React 拖拽排序怎么实现ReactSortable 从安装到多列表联动实战【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject做 React 页面时你肯定被拖拽排序折磨过任务列表要能一拖就换顺序看板卡片还要跨列搬家。自己写mousedown加mousemove算偏移能跑但又臭又长。ReactSortable 就是来解决这个的——它是 SortableJS 的 React 封装把拖完怎么同步状态这一步全包了你只管把列表渲染出来。它到底是什么一句话ReactSortable 让容器里的子项变得可拖并在拖结束后调用setList把排好序的数组还给你。和裸写 SortableJS 比你不用手动querySelector也不用自己 diff 新旧顺序和 dnd-kit 那类库比它更轻API 基本就是一个组件上手成本几乎为零。代价是能力上限受 SortableJS 约束特别复杂的场景可能不够用。5 分钟跑起来安装就一行sortablejs得一起装类型按需npm install react-sortablejs sortablejs npm install -D types/sortablejs最小可运行示例数组直接当列表用import { useState } from react; import { ReactSortable } from react-sortablejs; export function TaskList() { const [tasks, setTasks] useState([写文档, 评审方案, 开发核心功能]); return ( ReactSortable list{tasks} setList{setTasks} animation{150} {tasks.map((t) div key{t}{t}/div)} /ReactSortable ); }给list、接上setList拖完 React 自动重排完事。基础排序关键属性一览属性作用建议值animation拖动过渡时长毫秒150300handle只有按住这里才能拖.drag-handleghostClass空位占位符的样式类sortable-ghostscroll拖到边缘时自动滚动容器truefilter排除不可拖拽的区域.actionsdelay按下多少毫秒后才真正起拖100200animation{150}就是 150 毫秒过渡handle配个把手选择器能避免整行都能拖、点错按钮就乱跑。进阶玩法看板三列联动场景待办 / 进行中 / 已完成三列卡片要能互相搬。效果同一个group的列表互通拖过去时源列自动删、目标列自动插。关键配置ReactSortable list{todo} setList{setTodo} group{{ name: tasks, pull: true, put: true }} animation{150} {todo.map(t div key{t.id}{t.name}/div)} /ReactSortable三列都设成name: taskspull/put都放开即可。多选与交换插件场景批量挪动一堆文件或者要交换位置而不是插入。效果MultiDrag 支持按住多张卡片一起拖Swap 让拖到的位置两两对调。关键配置import { Sortable, MultiDrag } from sortablejs; Sortable.mount(new MultiDrag()); // 组件上打开多选 ReactSortable list{items} setList{setItems} multiDrag /插件挂载一次就全局生效不用每列重复挂。动画与滚动调优场景默认手感生硬想更跟手。效果过渡更平滑滚长列表不卡手。关键配置animation控制在 150300配合ghostClass给空位上色滚动区域加scroll并设scrollSensitivity{30}。遇到问题拖完出现重复项或乱序原因基本是key不稳——用了下标index。改成每项唯一的id作key重复项就没了。列表一大就卡原因是 DOM 节点多拖动时重排重绘太贵。超过 50 项就开forceFallback用 CSS transform 代替真实 DOM 拖动再拿React.memo包列表项。手机上拖不动触摸容易误触发滚动。加delayOnTouchOnly和delay{200}让用户按下稍等一下就真正起拖别把划屏误判成拖拽。拖到别的列本列状态没更新说明你只在目标列处理了setList。跨列时两列都得同步目标列插入、源列删除别只改一边。让它更快列表项用React.memo包起来避免整列重渲染。超过 50 项开forceFallback大列表更顺滑。key用稳定id别用数组下标。动画时长压到 300ms 以内拖得跟手不掉帧。滚动容器开scrollscrollSensitivity调到 30 左右。写在最后ReactSortable 适合标准拖拽排序 跨列联动这类高频场景装完几分钟就能跑起来要更复杂的多维拖拽再去看 SortableJS 的完整插件生态。建议接着读它的官方 README 和插件列表里面有每个事件的完整说明。【免费下载链接】openprojectOpenProject is the leading open source project management software for product, project and portfolio management. A powerful Jira alternative with agile planning, issue tracking, roadmaps, Gantt charts, time tracking, collaboration features, and more. Available on premises or in the cloud. ⭐ Star us on GitHub项目地址: https://gitcode.com/GitHub_Trending/op/openproject创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考