拖拽排序
拖拽适合调整任务、菜单、展示列表等人工维护的顺序。每条记录需要一个稳定且唯一的主键;默认字段为 id,其他字段通过 rowKey 指定。
安装依赖
在挂载表格前加载 Sortable。模块化项目可以安装 sortablejs 并在应用入口中设置:
import Sortable from 'sortablejs';
window.Sortable = Sortable;也可以在 HTML 的 head 中使用项目自己的静态资源地址:
<script src="/vendor/Sortable.min.js"></script>该文件需要由项目提供。本页已经加载 Sortable,无需在控制台重复引入。
行拖拽与数据同步
3.9.5+
拖拽完成后,CRUD 自动同步绑定的 data 数组。回调可用于保存排序结果,不再需要手动调用 refreshTable。
效果预览可直接操作下方示例
本例只开启 rowSort,便于观察行顺序。按住一行拖到另一行,核对下方的 ID 顺序;再点击「修改当前首行」确认数据仍对应正确的行。「恢复初始顺序」可以重置演示。
正在加载示例…
| 配置 | 作用 |
|---|---|
rowSort: true | 只开启行拖拽 |
columnSort: true | 只开启列拖拽 |
sortable: true | 同时开启行与列拖拽 |
rowKey: 'id' | 指定稳定的记录主键,不要使用数组下标 |
保存排序结果
sortable-change(oldIndex, newIndex, row, sortedList) 返回移动前后的下标、被移动的行,以及排好序的新数组。下标从 0 开始。需要保存到服务端时,可提取主键:
const onSortableChange = (oldIndex, newIndex, row, sortedList) => {
const ids = sortedList.map(item => item.id);
// 将 ids 交给项目的请求方法保存顺序。
};回调触发时,默认的数据同步尚未完成,因此请使用 sortedList 保存结果;下一次 Vue 更新后,data 会反映新顺序。如果已有代码在回调中同步替换数组或原地换序,也可以保留,但不要再异步重复执行一次相同的移动。
范围与常见问题
- 拖拽调整当前传入的数组。分页场景只调整当前页;跨页的全局顺序需要业务接口处理。
- 当前存在列排序、筛选或展开行,导致显示顺序与
data不一致时,不会执行行换序。先清除相关状态,再调整人工顺序。 - 不要同时通过列的
sortable自动排序和行拖拽维护同一份顺序。 - 若拖拽没有响应,先确认 Sortable 已在组件挂载前加载,再检查主键是否唯一且保持不变。
列拖拽与列宽调整可查看 表格列配置项。
