最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Layui数据表格中如何实现行拖拽排序功能
时间:2026-07-07 13:41:51 编辑:袖梨 来源:一聚教程网
Layui table 原生不支持行拖拽排序,rowDrag: true 是第三方插件(如 soulTable)功能;必须同步更新 table.cache 数据,否则拖拽后顺序回滚;服务端分页需先获取全量数据;移动端需用 touch 事件替代 drag API。
layui table 原生不支持行拖拽排序,所谓“开启即用”的 rowdrag: true 是第三方插件(如 soultable)提供的能力,不是 layui 官方模块的功能。直接在 table.render() 里加这个参数会完全无效。
为什么原生 table 拖拽后顺序会回滚
最常踩的坑是:只改了 tbody 里 tr 的 DOM 顺序,但没动 table.cache['yourId'] 里的数组。Layui 渲染、分页、导出、筛选全依赖这个缓存——它不变,reload 就还原;用户拖完一刷新,数据立刻回到原始顺序。
-
table.cache是 layui 内部唯一可信的数据源,必须手动用Array.splice()调整顺序 - 如果用了服务端分页(
url配置),table.cache只存当前页数据,跨页拖拽会失效,得先用table.getData()拿全量再操作 - 别在
drop里写table.reload("id", { data: [...] }),这会覆盖缓存,等于放弃你刚做的调整
用原生 drag API 实现的关键步骤
不引入第三方库也能跑通,但要注意浏览器行为差异和移动端兼容性断层:
- 给每行
<tr>加draggable="true",并在dragstart中用e.dataTransfer.setData('text', '')触发后续事件(Chrome/Firefox 必须) -
dragover和drop里必须调e.preventDefault(),否则默认跳转或页面滚动会拦截 - 插入位置不能靠
$(e.target).index(),DOM 重排后索引漂移;要用e.clientY+targetTr.getBoundingClientRect().top计算相对位置 - 移动端基本不触发
dragstart,手指一滑就触发页面滚动,必须单独检测'ontouchstart' in window,改用touchstart/touchmove/touchend+CSS transform模拟
用 Sortable.js 的注意事项
比原生更稳,但和 layui 表格 DOM 结构有耦合风险:
- 必须在
table.render()的done回调里初始化,确保tbody已真实渲染,传参必须是原生tbody[0],不能传 jQuery 对象 -
onEnd里用evt.oldIndex和evt.newIndex操作table.cache['id']数组,再调table.renderData('id')或table.reloadData('id') - 加
filter: '.layui-table-empty',否则空数据提示行会被误拖,导致索引错乱 - 禁用
ghostClass和chosenClass,layui 表格重绘时容易与这些样式冲突,引发视觉错位
真正麻烦的从来不是拖拽动画,而是 DOM、table.cache、服务端存储这三层状态的对齐时机。哪怕只漏掉一次缓存更新,用户就会觉得“拖了等于没拖”。
相关文章
- 试客联盟app如何绑定淘宝 07-08
- 小宇宙app如何查看账户余额 07-08
- 《吸血鬼爬行者》超武合成说明 07-08
- doubaocom官方网站链接如何直达 07-08
- 雪原余烬自新世界成就解锁方法分享 07-08
- One Turn Kill沉重打击流派玩法搭配 07-08