首页
/ react-sortable-hoc API全解析:掌握所有配置选项

react-sortable-hoc API全解析:掌握所有配置选项

2026-02-05 05:42:52作者:幸俭卉

你是否在开发列表排序功能时遇到过拖拽不流畅、配置项混乱的问题?本文将系统解析react-sortable-hoc的全部API配置,帮助你轻松实现动画流畅、交互友好的可排序列表。读完本文你将掌握:SortableContainer核心属性配置、SortableElement使用技巧、SortableHandle高级应用,以及常见场景的最佳实践。

核心组件概览

react-sortable-hoc通过三个高阶组件实现排序功能,它们的关系如下:

graph TD
    A[SortableContainer] -->|包裹| B[SortableElement]
    B -->|可选| C[SortableHandle]
    A -->|提供上下文| D[Manager]
    D -->|处理逻辑| E[AutoScroller]

主要组件文件路径:

SortableContainer配置详解

作为最核心的组件,SortableContainer提供了丰富的配置选项,定义在src/SortableContainer/props.js中。

基础配置

属性名 类型 默认值 描述
axis string 'y' 排序方向,可选值:'x'(水平)、'y'(垂直)、'xy'(自由方向)
distance number 0 触发拖拽所需的最小移动距离(像素)
pressDelay number 0 触发拖拽前的延迟时间(毫秒)
transitionDuration number 300 排序动画持续时间(毫秒)

⚠️ 注意:distancepressDelay不可同时使用,源码中通过validateProps方法进行校验

拖拽行为控制

// 禁止特定元素触发拖拽
const shouldCancelStart = (e) => {
  return e.target.tagName === 'INPUT';
};

<SortableContainer
  shouldCancelStart={shouldCancelStart}
  lockToContainerEdges={true}  // 限制在容器内拖拽
  lockOffset="50%"             // 拖拽时元素中心点偏移
>
  {children}
</SortableContainer>

关键属性定义:

  • shouldCancelStart: 默认实现过滤了输入框、链接等元素
  • lockToContainerEdges: 限制拖拽范围在容器内
  • useDragHandle: 设为true时仅允许通过SortableHandle触发拖拽

样式与外观

通过以下属性自定义拖拽过程中的视觉效果:

<SortableContainer
  helperClass="custom-helper"  // 拖拽辅助元素的CSS类
  hideSortableGhost={true}     // 是否隐藏原位置元素
  getHelperDimensions={(node) => ({  // 自定义辅助元素尺寸
    width: node.offsetWidth,
    height: node.offsetHeight
  })}
>

其中getHelperDimensions的默认实现位于src/SortableContainer/defaultGetHelperDimensions.js

SortableElement使用指南

SortableElement用于包装可排序的列表项,核心代码在src/SortableElement/index.js

基础用法

import sortableElement from './src/SortableElement';

const SortableItem = sortableElement(({value}) => (
  <li>{value}</li>
));

// 在列表中使用
{items.map((value, index) => (
  <SortableItem
    key={`item-${index}`}
    index={index}          // 必需元素在列表中的位置
    collection={0}         // 可选用于多列表排序
    disabled={value.locked} // 可选禁用特定项的排序
  />
))}

关键属性

属性名 类型 默认值 描述
index number 必需 元素在列表中的索引,用于排序计算
collection number/string 0 集合标识,用于区分多个独立排序区域
disabled boolean false 是否禁用当前元素的排序功能

SortableHandle高级应用

当需要自定义拖拽触发区域时,可使用SortableHandle组件,定义在src/SortableHandle/index.js

使用示例

import sortableHandle from './src/SortableHandle';

// 创建拖拽手柄组件
const DragHandle = sortableHandle(() => (
  <div className="drag-handle"></div>
));

// 在SortableElement中使用
const SortableItem = sortableElement(({value}) => (
  <li>
    <DragHandle />
    <span>{value}</span>
  </li>
));

// 在容器中启用手柄模式
<SortableContainer useDragHandle={true}>
  {items.map((item, index) => (
    <SortableItem key={index} index={index} value={item} />
  ))}
</SortableContainer>

注意:使用SortableHandle时,必须在SortableContainer上设置useDragHandle={true}

事件处理

react-sortable-hoc提供了完整的事件回调机制,用于响应排序过程中的各种状态变化。

主要事件

const onSortStart = ({index, collection, event}) => {
  // 拖拽开始时触发
  console.log('开始拖拽:', index);
};

const onSortUpdate = ({oldIndex, newIndex, collection}) => {
  // 拖拽位置变化时触发(未完成)
};

const onSortEnd = ({oldIndex, newIndex, collection}) => {
  // 拖拽完成时触发
  if (oldIndex !== newIndex) {
    const newItems = [...items];
    const [removed] = newItems.splice(oldIndex, 1);
    newItems.splice(newIndex, 0, removed);
    setItems(newItems);
  }
};

<SortableContainer
  onSortStart={onSortStart}
  onSortUpdate={onSortUpdate}
  onSortEnd={onSortEnd}
>

事件对象结构

所有事件回调都接收包含以下属性的对象:

  • oldIndex: 拖拽前的位置
  • newIndex: 拖拽后的位置
  • index: 当前操作的元素索引
  • collection: 集合标识
  • event: 原始DOM事件

高级配置

键盘导航

react-sortable-hoc内置键盘支持,默认按键定义在[src/SortableContainer/props.js#L53-L59]:

const defaultKeyCodes = {
  lift: [KEYCODE.SPACE],    // 空格键:开始/结束拖拽
  drop: [KEYCODE.SPACE],
  cancel: [KEYCODE.ESC],    // ESC键:取消拖拽
  up: [KEYCODE.UP, KEYCODE.LEFT],  // 上/左箭头:向上移动
  down: [KEYCODE.DOWN, KEYCODE.RIGHT] // 下/右箭头:向下移动
};

可通过keyCodes属性自定义按键映射:

<SortableContainer
  keyCodes={{
    lift: [32, 13],  // 空格和回车键都可触发拖拽
    up: [38],
    down: [40],
    cancel: [27]
  }}
>

自动滚动

当拖拽靠近容器边缘时,可配置自动滚动行为:

<SortableContainer
  disableAutoscroll={false}  // 是否禁用自动滚动
  useWindowAsScrollContainer={true}  // 使用窗口作为滚动容器
>

自动滚动功能由src/AutoScroller/index.js实现,可处理复杂的滚动场景。

示例项目参考

项目提供了多个实用示例,位于examples/目录:

最佳实践总结

  1. 性能优化

  2. 无障碍访问

    • 保留键盘导航功能,不要修改默认keyCodes
    • 确保拖拽状态有清晰的视觉反馈
  3. 多列表排序

    • 使用collection属性区分不同列表
    • onSortEnd中根据collection值处理不同列表间的元素移动

通过合理配置react-sortable-hoc的API,你可以轻松实现各种复杂的排序需求。完整的API文档可参考项目源码中的属性定义,结合示例代码能更快掌握使用技巧。

登录后查看全文
热门项目推荐
相关项目推荐