Layui数据表格如何实现前端根据某列数据进行二次排序

星降

星降

2026-06-22

279人浏览

原创

Layui的table.sort()不支持二次排序,因其仅单列三态切换且无多列组合排序机制;需禁用自动排序、监听sort事件、手动维护多级排序规则并用稳定算法重排table.cache数据后reload。

为什么直接调用 table.sort() 无法实现二次排序

layuitable.sort() 默认只维护单列的升/降序状态,每次点击同一列都会在“升序→降序→取消排序”三态间切换,不会保留上一次其他列的排序逻辑。所谓“二次排序”,本质是多列组合排序(比如先按 status 升序,再按 create_time 降序),而 layui 原生不支持多列同时激活排序状态。

手动拦截排序事件 + 自定义数据重排是最可靠方案

核心思路:禁用 Layui 默认排序行为,监听 sort 事件,拿到当前点击列字段和顺序后,自行对 table.cache 或原始数据源做稳定排序(注意必须用稳定排序算法,否则相同键值的行顺序会乱)。

  • table.render() 中设置 autoSort: false 关闭自动排序
  • 绑定 table.on('sort(demo)', function(obj){...}) 捕获点击
  • 维护一个排序队列(如 sortRules = [{field: 'status', type: 'asc'}, {field: 'id', type: 'desc'}]),每次点击追加或替换规则
  • Array.prototype.sort() 实现多级比较:先比第一级,相等再比第二级,以此类推
  • 排序完成后调用 table.reload() 并传入 data(不要传 url,否则会重新请求)

示例关键片段:

table.on('sort(demo)', function(obj){
  // 手动管理排序规则,这里简化为最多两列:主列 + 次列
  if (obj.field === 'status') {
    sortRules = [{field: 'status', type: obj.type}, {field: 'id', type: 'desc'}];
  } else if (obj.field === 'id') {
    sortRules = [{field: 'id', type: obj.type}, {field: 'status', type: 'asc'}];
  }
  
  // 对 cache 数据做稳定多级排序
  const sorted = table.cache.demo.sort((a, b) => {
    for (let rule of sortRules) {
      const aVal = a[rule.field], bVal = b[rule.field];
      if (aVal  bVal) return rule.type === 'asc' ? 1 : -1;
    }
    return 0;
  });
  
  table.reload('demo', {data: sorted});
});

注意 table.cache 的生命周期和引用陷阱

table.cache['demo'] 是 Layui 内部缓存的数据副本,但它不是响应式,且在 reload() 时会被重置。如果你在排序前修改了原始数据(比如通过 table.cache 直接赋值),后续 reload() 可能失效或引发重复渲染。

面向设计的AXUI前端框架表单
面向设计的AXUI前端框架表单

面向设计的AXUI前端框架表单是一款包含表格、列表、弹窗等的AXUI前端框架表单下载。

下载
  • 永远基于 table.cache.xxx 做排序计算,不要试图 patch 原始数据源
  • 如果用了异步加载(url 配置),首次排序前需确保 table.cache 已就绪(可监听 done 回调)
  • 避免在 sort 事件里直接改 table.cache 元素属性——它只是浅拷贝,改了会影响下一次 reload 的初始状态
  • 若需持久化排序结果,应把排序逻辑下沉到请求层(后端排序),前端仅作展示态同步

移动端点击排序容易误触,建议加防抖和视觉反馈

Layui 表格列头没有 loading 状态,连续点击可能触发多次排序,导致 UI 卡顿或顺序错乱。

  • setTimeout + 标志位简单防抖(500ms 内只响应第一次)
  • 排序中给列头加 layui-disabled 类或临时移除 lay-sort 属性,防止重复点击
  • 如果排序耗时明显(比如上千行前端排序),考虑加骨架屏或 loading: true 配合 table.load()

真正麻烦的不是写几行排序代码,而是保证排序稳定性、缓存一致性、以及和分页/搜索/选中态的协同。一旦引入多列排序,table.cache 就不能再当“只读快照”用了——它成了你整个表格状态的单一事实来源,任何绕过它的修改都可能埋雷。

前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

前端 layui

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1111

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

2262

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

2132

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

2322

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

336

5

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

1560

5

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.23

1425

1

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

2023.10.13

588

3

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

2025.09.10

1335

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ThinkPHP配置开发与CMS后台实战
ThinkPHP配置开发与CMS后台实战

共87课时 | 11.4万人学习

第二十三期_综合实战
第二十三期_综合实战

共89课时 | 9.7万人学习

Layui 快速入门精讲
Layui 快速入门精讲

共5课时 | 1.5万人学习