0Pricing
React Academy · 课时

用于可重排序列表的 SortableContext

使用 SortableContext 和 useSortable 构建带平滑动画的可重排序列表

用于可重排序列表的 SortableContext 是 CoddyKit 上的免费 React Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

SortableContext 的作用

SortableContext 是 dnd-kit 中用于包装可重新排序列表的专用组件。useDraggable 和 useDroppable 处理任意形式的拖放,而 SortableContext 专门处理列表项目需要通过拖动到新位置来重新排序的情况。

items 属性

SortableContext 要求提供 items 属性:一个由唯一字符串或数字 ID 组成的数组,这些 ID 必须与子级可排序组件所使用的 ID 相匹配。该数组的顺序定义了项目的当前顺序。当您在状态中更新此数组时,列表会按新顺序重新渲染。

排序策略

SortableContext 接受一个 strategy 属性,用于控制项目的排序方式。verticalListSortingStrategy 用于垂直列表,会根据垂直位置计算插入点。horizontalListSortingStrategy 用于水平列表。rectSortingStrategy 用于网格。请选择与布局相匹配的策略。

useSortable 钩子

在 SortableContext 内部,每个列表项目都使用 useSortable({ id }) 钩子,而不是 useDraggable。useSortable 是 useDraggable 的超集——它返回相同的属性、监听器、setNodeRef 和变换,另外还返回 isDragging 和 overIndex 等专门用于排序的值。

使用 isDragging 表示视觉状态

来自 useSortable 的 isDragging 值会在项目正被拖动时保持为 true。通常,您可以利用它降低列表中原始项目的不透明度,或在项目被拖动时为其添加占位符样式。这个视觉上的空缺会向用户显示该项目当前位于列表中的位置。

arrayMove 工具

dnd-kit 从 @dnd-kit/sortable 导出了 arrayMove(array, fromIndex, toIndex) 工具。它会返回一个新数组,其中位于 fromIndex 的项目被移动到 toIndex。排序拖动完成后,更新状态数组的标准方式就是使用它。

实现用于排序的 onDragEnd

在可排序列表的 DndContext onDragEnd 回调中,您可以使用 items.indexOf(event.active.id) 和 items.indexOf(event.over?.id) 找到旧索引和新索引。如果两个索引都有效且彼此不同,就调用 setItems(arrayMove(items, oldIndex, newIndex)) 重新排列数组。

被挤开项目的平滑动画

拖动某个项目时,列表中的其他项目会动画移动到新位置,以显示被拖动项目将要落下的位置。useSortable 会为每个未被拖动的项目提供 CSS 变换,使其移到一边。为此变换添加 CSS 过渡效果,就能创建平滑的移动动画。

实现平滑移动的过渡效果

为可排序项目的变换属性应用 CSS 过渡效果:transition: isDragging ? undefined : transform ? 'transform 200ms ease' : undefined。项目被拖动时不需要过渡效果(它应该直接跟随光标)。项目被挤开时,过渡效果会创建平滑的滑动动画。

与 DragOverlay 组合使用

为了获得最佳用户体验,请将 SortableContext 与 DragOverlay 组合使用。列表中的被拖动项目会变成半透明的占位符(使用 isDragging),而 DragOverlay 会渲染一个实体且具有悬浮感的副本,跟随光标移动。这种方式可以避免被拖动项目在不同位置之间跳动所造成的视觉问题。

垂直列表和水平列表

SortableContext 同样适用于垂直列表(任务板、待办列表)和水平列表(标签栏、图片轮播)。您可以通过更改策略属性,在不同策略之间切换。您甚至可以使用 rectSortingStrategy 实现网格布局,它会根据拖动位置计算最近的网格单元。

onDragEnd 中的 arrayMove

在 onDragEnd 中调用 arrayMove 重新排列可排序列表时,需要传入哪些参数?

课程回顾:SortableContext

SortableContext 包装可重新排序的列表,并要求提供由唯一 ID 组成的 items 数组,以及一种策略(垂直、水平或网格)。每个项目使用 useSortable 而不是 useDraggable,因此会获得 isDragging 和 overIndex。在 onDragEnd 中,arrayMove(items, oldIndex, newIndex) 会重新排列数组。对变换应用 CSS 过渡效果,可以平滑地为被挤开的项目制作动画。

常见问题解答

「用于可重排序列表的 SortableContext」课时是免费的吗?

是的 — 「用于可重排序列表的 SortableContext」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「用于可重排序列表的 SortableContext」这节课中我会学到什么?

使用 SortableContext 和 useSortable 构建带平滑动画的可重排序列表 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「用于可重排序列表的 SortableContext」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. dnd-kit 架构与无障碍优先设计
  2. DndContext、useDraggable 与 useDroppable
  3. 用于可重排序列表的 SortableContext
  4. 自定义拖动覆盖层与多容器拖放
← 返回 React Academy