zent
Version:
一套前端设计语言和基于React的实现
131 lines (102 loc) • 9.01 kB
Markdown
---
title: Sortable
subtitle: 拖拽排序
path: component/sortable
group: 信息展示
---
通过拖动页面元素来达到组织信息的功能。
- 适用于对多个功能、列表、图片进行直观、自由度较高的排序场景;
- 不支持分页拖拽
| 参数 | 说明 | 类型 | 默认值 | 备选值 |
| ----------- | ---------------------- | ----------------------- | ------- | ---------------------- |
| tag | 容器元素的 HTML 标签名 | string | `'div'` | 一切合法的 HTML 标签名 |
| items | 被排序元素的数组 | array | | |
| onChange | 排序完成时的回调函数 | (newItems: array): void | `noop` | |
| filterClass | 禁用排序元素的类名 | string | | |
| className | 自定义额外类名 | string | `''` | |
⚠️ 注意:基础 API 可以满足绝大多数的拖拽需求,items 和 onChange 必须同时出现,作为一个受控组件,你需要在 onChange 中拿到新的数组,然后自己更新数据,如果有更复杂的需求,也可以不用 items 和 onChange,而使用下面的进阶 API 实现更复杂的功能。
| 参数 | 说明 | 类型 | 默认值 | 备选值 |
| ----------------- | ------------------------------------------ | -------------------------------------------------------------- | ----------------- | --------------- |
| sort | 是否支持拖拽 | bool | `true` | `true`, `false` |
| group | 用于多容器拖拽的分组(详见[Group](
| delay | 拖拽时延迟的时间(ms) | number | 0 | |
| animation | 拖拽时的动画持续时间(ms) | number | 0 | |
| handle | 拖动柄的选择器(比如 '.sortable-handle') | string | | |
| ghostClass | 拖拽目标处填充元素的类名 | string | `'zent-ghost'` | |
| chosenClass | 被选中的元素的类名 | string | `'zent-chosen'` | |
| dragClass | 正在被拖拽的元素的类名 | string | `'zent-drag'` | |
| forceFallback | 是否忽略 HTML5 的拖拽行为并强制回退 | bool | `false` | `false`, `true` |
| fallbackClass | 使用 forceFallback 时克隆的 DOM 元素的类名 | string | `'zent-fallback'` | |
| fallbackOnBody | 是否将克隆的 DOM 元素附加到 Body 中 | bool | `false` | `false`, `true` |
| fallbackTolerance | 拖动行为生效前鼠标移动的距离(px) | number | 0 | |
| scroll | 拖拽过程中是否允许屏幕滚动 | bool | `true` | `true`, `false` |
| scrollFn | 如果你有自定义滚动条,该方法可用于自动滚动 | (offsetX: number, offsetY: number, originalEvent: Event): void | | |
| scrollSensitivity | 触发滚动时鼠标距离边缘的像素值(px) | number | 30 | |
| scrollSpeed | 滚动速度(px/s) | number | 10 | |
| 参数 | 说明 | 类型 | 默认值 | 备选值 |
| -------- | -------------------------------------------------- | ------------------------------------------------------------------- | ------ | ------ | --- | --- |
| setData | 用于调用 HTML5 原生的 DataTransfer.setData 方法 | (dataTransfer: object, dragEl: HTMLElement): void | | | | |
| onChoose | 元素被选中时的回调函数 | (e: Event) (详见[事件回调](
| onStart | 元素开始拖拽时的回调函数 | (e: Event) (详见[事件回调](
| onEnd | 元素结束拖拽时的回调函数 | (e: Event) (详见[事件回调](
| onAdd | 元素从另一个容器被拖拽到当前容器的回调函数 | (e: Event) (详见[事件回调](
| onUpdate | 元素被重新排序时的回调函数 | (e: Event) (详见[事件回调](
| onSort | 当有元素被排序时的回调函数(例如新增,更新,删除) | (e: Event) (详见[事件回调](
| onRemove | 当元素从当前容器拖拽至其他容器时的回调函数 | (e: Event) (详见[事件回调](
| onFilter | 当尝试拖拽一个被禁用拖拽的元素时的回调函数 | (e: Event) (详见[事件回调](
| onMove | 当在一个容器内或者不同容器之间拖拽元素时的回调函数 | (e: Event, originEvent: Event) (详见[事件回调](
| onClone | 当复制元素时的回调函数 | (e: Event) (详见[事件回调](
要将元素从一个列表拖到另一个列表中,这两个列表必须具有相同的分组名称(Group 值)。 你还可以定义列表是否可以放弃,给予和保留元素的副本(clone),或接收元素。
- name: `string` 分组的名称
- pull: `true | false | 'clone' | function` 从列表中拖出的能力,如果设置为 `'clone'` 则不会移动元素,而是复制。
- put: `true | false | ['foo', 'bar'] | function` 是否可以从其他列表添加元素,还是可以设置为可接受元素的列表的一组组名。
- revertClone: `boolean` 当移动到另一个列表后,将克隆的元素还原到初始位置。
- onChoose, onStart:
```js
function (/**Event*/evt) {
evt.oldIndex; // 元素在父元素中的下标(number)
},
```
- onEnd, onAdd, onUpdate, onSort, onRemove:
```js
function (/**Event*/evt) {
evt.item; // 被拖拽的元素(HTMLElement)
evt.to; // 元素在拖拽开始前所在的列表(HTMLElement)
evt.from; // 元素在拖拽结束后所在的列表(HTMLElement)
evt.oldIndex; // 元素在拖拽开始前的父元素中的下标(number)
evt.newIndex; // 元素在拖拽结束后的父元素中的下标(number)
},
```
- onFilter:
```js
function (/**Event*/evt) {
evt.item; // 接收到 `mousedown|tapstart` 事件的元素(HTMLElement)
},
```
- onMove:
```js
function (/**Event*/evt, /**Event*/originalEvent) {
evt.dragged; // 被拖拽的元素(HTMLElement)
evt.draggedRect; // 被拖拽元素的TextRectangle {left, top, right, bottom}
evt.related; // 拖拽的目标元素(HTMLElement)
evt.relatedRect; // 拖拽的目标元素的TextRectangle {left, top, right, bottom}
originalEvent.clientY; // 鼠标所在的位置(number)
// return false; — 用于取消拖拽
},
```
- onClose:
```js
function (/**Event*/evt) {
evt.item; // 原始元素(HTMLElement)
evt.clone // 被复制的元素(HTMLElement)
},
```