Layui数据表格开启前端排序切换功能实现Demo

ops/2024/12/26 22:34:15/

备注

  1. 分页一般情况下必须得增加排序条件,不然排序可能会出现问题

  2. 采用的前端框架是Layui、后端是SpringBoot、Mybatis、数据库是PostgreSQL

  3. pgsql排序需注意null值

    – 表示null排在有值行的前面
    select * from tbl order by id nulls first;
    – 表示null排在有值行的后面
    select * from tbl order by id nulls last;

Layui表格根据对应字段进行切换排序

Layui数据表格官网地址

主要是通过针对Layui表格table的cols列表渲染中的sort属性,以及表格监听sort事件进行实现,后端根据前台传递过来的排序属性和排列方式进行动态切换数据表格的排序方式。

参考官方文档

1. 表格sort事件

Layui表格排序事件

表格列表选项渲染

表格cols选项渲染

代码实战

1、前端页面代码渲染
HTML
  <table class="layui-hide" id="table" lay-filter="table"></table>
js
//获取本服务对应地址
let domainName = window.location.origin;
layui.use(['form', 'table', 'util', 'upload', 'laydate','xmSelect'], function (//表格渲染Common.layTablePageRender({elem: '#table',url: "/guide/core/list",page: true,limit: 10,tableId: 'tableId',height: "full-255",toolbar: '#toolBar',autoSort: false,cols: [[{type: 'checkbox', fixed: 'left'},{field: 'name', align: 'center', title: '标题', minWidth: 250},//sort开启上线时间日期渲染{field: 'declareTime', align: 'center', title: '上线日期', minWidth: 100,sort:true},{field: 'createBy', align: 'center', title: '创建人', minWidth: 100},{field: 'recentOperate',align: 'center',title: '最近一次操作',minWidth: 100,templet: function (row) {if (row.updateBy) {return `${row.updateBy}于${row.updateTime}修改`;}return '';}}]]})//监听表格排序事件table.on('sort(table)', function (obj) { //注:tool 是工具条事件名,test 是 table 原始容器的属性 lay-filter="对应的值"// obj为表格排序数据console.log(obj.field); // 当前排序的字段名console.log(obj.type); // 当前排序类型:desc(降序)、asc(升序)、null(空对象,默认排序)console.log(this); // 当前排序的 th 对象// 尽管我们的 table 自带排序功能,但并没有请求服务端。// 有些时候,你可能需要根据当前排序的字段,重新向后端发送请求,从而实现服务端排序,如:let field = {};field.sortType = obj.type;field.sortField = obj.field == 'declareTime' ? 'declare_time' : obj.field;table.reload('tableId', {page:{curr:1},where: field})});));
//封装的layui表格渲染方法,针对的是若依框架的分页数据渲染方式
Common.layTablePageRender= function ({elem,url,page,toolbar,limit,tableId,height,cols,where}){if (!page) page = trueif (!limit) limit = 10layui.table.render({elem: elem,url: domainName + url,headers: {"Authorization": 'Bearer ' + localStorage.getItem("access_token")},request: {pageName: 'pageNum' //页码的参数名称,默认:page, limitName: 'pageSize' //每页数据量的参数名,默认:limit},toolbar:toolbar,page: page,limit: limit,id: tableId,height,cols: cols, parseData: function (res) { //res 即为原始返回的数据if (res.code == messageState.success) {return {"code": 0, //解析接口状态 0-正确码"msg": res.msg, //解析提示文本"count": res.total, //解析数据长度"data": res.rows //解析数据列表};} else if (res.code == messageState.fail) {myLayer.Alert('加载失败!');return false;} else {myLayer.Alert(res.msg, function () {messageState.timeoutToLogin();});return false;}},where:where});
}
后台代码
//controller/*** 查询指南列表*/@PreAuthorize("@ss.hasPermi('guide:core:list')")@ApiOperation("查询列表")@GetMapping("/list")public TableDataInfo list(Integer pageNum,Integer pageSize,String sortField,String sortType) {//开启分页PageHelper.startPage(pageNum, pageSize);List<BackGuideCoreDetailVo> list = guideCoreService.selectList(sortField,sortType);return getDataTable(list);}//serviceList<BackGuideCoreDetailVo> selectList(sortField,sortType);//service实现类@Overridepublic List<BackGuideCoreDetailVo> selectList(sortField,sortType) {List<BackGuideCoreDetailVo> list = guideCoreMapper.selectList(sortField,sortType);return list;}//mapper接口List<BackGuideCoreDetailVo> selectList(@Param("sortField") String sortField, @Param("sortType") String sortType);    	
xml
   <select id="selectList" resultMap="BackGuideCoreDetailVo">select *from com_user a -- 存在需要排序的字段<if test="sortField!='' and sortField != null">order by a.${sortField} ${sortType}</if>-- 默认排序<if test="sortField == null">order by a.update_time desc nulls last,create_time desc</if></select>

http://www.ppmy.cn/ops/145227.html

相关文章

Python基础知识回顾

数据类型 Python可以区分整数&#xff08;integers、下文简写为int&#xff09;、浮点数&#xff08;float&#xff09;、字符串&#xff08;string&#xff09;和布尔值&#xff08;Boolean&#xff09;等数据类型。 1&#xff09;int是可正可负的整数 2&#xff09;float包…

basic_ios及其衍生库(附 GCC libstdc++源代码)

basic_ios及其衍生库(附 GCC libstdc源代码) 我们由这张图展开我们的讨论 对于Date对象&#xff0c;只有实现了<<重载到输出流才可以插入到stringstream ss中 现在我有疑问stringstream是怎么做到既能输出又能输入的&#xff1f; 而且为什么stringstream对象能传给ostre…

MR-GDINO: Efficient Open-World Continual Object Detection

摘要 开放世界&#xff08;OW&#xff09;识别与检测模型展现出了强大的零样本和少样本适应能力&#xff0c;这启发了人们将其作为初始化方法应用于持续学习方法中以提高性能。尽管在已见类别上取得了令人鼓舞的结果&#xff0c;但由于灾难性遗忘&#xff0c;这些模型在未见类…

iOS 多个输入框弹出键盘处理

开发中遇到这样一个场景&#xff0c;有多个输入框 而不同的输入框&#xff0c;需要页面向上偏移的距离不一样 这个时候&#xff0c;需要我们在获取到键盘弹出通知的时候&#xff0c;需要 知道我们开始进行编辑的是哪一个输入框&#xff0c;这个时候 需要我们知道一个技术点&…

2024.12 迈向可解释和可解释的多模态大型语言模型:一项综合调查

https://arxiv.org/pdf/2412.02104 问题 随着多模态大语言模型&#xff08;MLLMs&#xff09;在人工智能领域的快速发展&#xff0c;其在处理多模态信息&#xff08;如文本、图像、视频、音频&#xff09;时展现出强大的能力&#xff0c;但模型的复杂性和规模导致其决策过程难…

mysql系列5—Innodb的缓存

背景 建议读者站在设计者的角度&#xff0c;思考如何设计InnoDB缓存 以[mysql系列3—mysql索引图解]中的聚簇索引为例, 查询主键为33的记录: [1] 加载聚簇索引根节点所在的数据页&#xff1b; [2] 使用33与目录(21, 35)依次进行比较&#xff0c;得到子节点信息(地址、表空间、…

Linux复习3——管理文件系统2

修改文件权限命令 chmod 功能&#xff1a; chmod 命令主要用于修改文件或者目录的权限 只有文件所有者和超级用户可以修改文件或目录的权限 (1)使用数字表示法修改权限 所谓数字表示法是指将读取(r)、写入(w)和执行(x)分别以4、2、1来表示&#xff0c;没有授予的部分就表示…

Charles安装证书过程(手机)

背景&#xff1a;使用模拟器抓包时&#xff0c;发现https请求无法抓取&#xff0c;需要安装相应证书。我自己是因为模拟器升级了安卓7&#xff0c;发现之前安装的证书无效了&#xff0c;需要重新安装。 参考博客&#xff1a;夜神模拟器12Charles进行Https抓包_模拟器抓包ssl-C…