谈谈 table 的 sort

讨论 未结 置顶 精帖
48 2217
岁月小偷
悬赏:80飞吻
今天来谈谈table sort的那点事。预告一下,目的是做到前台排序还有服务器排序区分开,目前的table的分页实际是比较“乱”的,相信很多用的有一段时间的特别是做server排序的同学都会多多少少遇到不正常的情况。
先看看目前layui自带的排序的效果,中文按字典排序这些不是本次讨论的重点,先看看如果存在整数负数还有0出现的情况

那么是不是调整一下sort里面的逻辑就可以了让它对负数和0的判断逻辑对了就好了。好吧,这个其实也不是这次讨论的重点。
那么重点是,server排序,实际上绝大部分的table的排序不会只是单页面的这样子简单的排序,而是把条件传到后台让后台排序,那么官方给出的一般是监听sort然后reload,把条件传过去,这些都很ok,逻辑都没问题,but实际得到的效果呢?因为目前table没有区分前台排序还是server排序,在接收到数据之后再渲染表格的时候判断到有initSort,那么会再次将数据排序,然后显示,这就存在一个非常严重的问题!明明server已经排好序了,为啥还要js里面再sort一下,更严重的是,能保证sort出来的结果跟后台排序的规则出来的结果一致么?拿什么保证呢?看看下面的代码监听reload的时候然后模拟后台把数据按照负数<0<正数这个规则返回的data,实际reload之后是什么样子吧。
代码

效果

可能你会觉得跟前面没啥区别呀,排序的时候还是错了呀,这正是异常的地方。看看我模拟返回的data里面的结构吧
原始的data:

模拟的接口返回的data:

这个返回之后显然显示的效果跟实际数据的顺序对不上号

原因就是上面说的,实际发后台排序的时候到了渲染的时候还是要走一次前台排序,等于是做了一个画蛇添足的处理。实际如果我们定义成server排序返回的数据就是要显示的顺序了,绝对不能再走前端sort一下这个逻辑,不然后台排序的意义是什么还有如何保证逻辑跟后台是一致的,一致的话顶多算是一个无用功,但是如果不能保证一致,这个就是一个大事故了。
解决方案:提供用户一个配置项,决定是前台排序还是server排序。修改如下
需要修改的原始代码区域

修改之后的对应区域的代码:

测试的table在render的时候加入了sortType的配置

最后是sort的监听

最后的效果

完整的测试代码还有对table.js的对应修改的地址: https://pan.baidu.com/s/1OjwwVmjy02wRQ0rT1euLlQ
写在最后:实际这个到这里基本就可以了,但是其实还有一个可以优化的,就是假定加入了sortType的设定之后,那么实际点击排序的时候应该在table里面就自己去reload了而不用多此一举的自己还添加sort监听然后再里面执行reload,但是这个要让table自己去reload就涉及到接口的参数问题,不过处理也不是很难哈,这里抛砖引玉,如果自己觉得这个功能适合自己的话可以试着在这个基础上去调优,做到不需要自己监听sort而是设置sortType的类型就可以让它自己去再次发起请求。如果需要提供的话可以回帖,我进一步整理之后再追加出来[微笑]
※更新于:2018年9月14日08:48:49
对sortKey的逻辑稍加修改,这个不管是前端排序还是服务端排序都要维护的,避免重复操作,原始代码中再默认排序的时候会删除,在上面代码的基础上稍加调整为:
回帖
  • Xiny
    2018-9-13
    @岁月小偷 非常蛋疼的痛点。大佬。能不能把改过的table重新封装成第三方的扩展,像这种排序类似的痛点问题都给解决了。拜谢!!![威武] [威武] [威武] [威武] [威武]
    3 回复
  • @岁月小偷 老哥能的这些完全就是table的痛点,我就不明白为什么贤心每次更新都不去解决这些基础问题,一直在增加"前端"功能,前端功能,匪夷所思,都是增加的鸡肋功能
    3 回复
  • 我现在都怀疑不是贤心写的了,水平感觉有限
    2 回复
  • table.dataParams = ['url', 'method', 'where', 'contentType', 'headers', 'parseData', 'request', 'response', 'data', 'page'];
    这个应该加上initSort吧??
    1 回复
  • @火箭总冠军 具体得看代码,光这个描述比较模糊,不知道你说的是在目前sort的基础上添加的这个beforeSort还是完全舍弃原有sort的逻辑自己写的一套从维护样式到事件监听啥的。如果还是走sort,只是在beforesort里面请求数据排序,最后只要还是走sort后面的处理的话还是会导致后端传过来的数据会被table再sort一下的,这个解决的不是说不能后端排序,而是后端排序之后回来table还自己排一次导致的问题。
    1 回复
  • 厉害了[good]
    1 回复
  • JuggerHoo
    2018-9-17
    楼主,我的源码怎么和你不一样啊,完全不知道怎么改好[泪] [泪]
    1 回复
  • @JuggerHoo 你这个是经过混淆压缩的,改起来非常麻烦的,建议把这个问题替换成未压缩混淆的,要在混淆上修改也不是改不了,就是可读性比较差,不多耐心的看耐心的读他的代码还要用关键字找到对应的位置,对比源码的还有混淆的之间的区别。利用一些方法去修改,把混淆的还有源码的变量给对应起来,基本就可以了,不过最好还是通过源码版本的修改最后项目发布的时候再把代码压缩成发布版的这样子的方式来改比较好。
    1 回复
  • @一个幽默的代码 谢谢认可[微笑]
    1 回复
  • JuggerHoo
    2018-9-17
    @岁月小偷 我在官网上下的就是这样的。。,哪里下到源码版本?
    1 回复
  • @岁月小偷 能否把改的那个reload和这个排序的一个发个table.js,你讲的都是痛点,厉害啊老哥
    0 回复
  • Xiny
    2018-9-13
    @帅不过十秒 老铁 开源的东西。给你用,不是义务。
    0 回复
  • @Xiny 收费的用户呢
    0 回复
  • @Xiny 我能说我们买个admin吗
    0 回复
  • @帅不过十秒 帖子里面的连接中的table.js就是包含了最近三个帖子对应的修改的内容了。谁都不可能做到面面俱到、无懈可击啦,更多新的内容还是很有吸引力的,也不是自己不需要别人也就不需要,俗话说“三个臭皮匠赛过诸葛亮”,有一些实际场景中的痛点问题也可以自己尝试修复,然后给他们pull request,或者在社区发出来给大家分享分享,如果引起足够的影响的话官方也会关注这些问题的。现在我一般不在git上给他们pull request因为觉得自己的代码逻辑应该还不够完善,只要把思路给出来了,他们也发现了这个问题了就足够了,他们自己修复的话可以更加放开手脚改,就像上个帖子中关于table中request参数的范围的数组,之所以放在table下面是方便大家后面可以自行添加我写漏的,比如你提到的initSort,其实还有cellMinWidth之类的甚至后面用着用着又会新增一些自定义的参数,这时候比较方便随时在需要的时候也可以扩展一下,让他们来做的话估计就会做的更好,有更好的方案或者更加全面的严谨的集合然后放在一个不能随便修改的地方。诸如这样这些类似的细节等等。
    0 回复
  • @Xiny 只是一个功能的调整啦,谈不上第三方,要是足够能当成一个同名的第三方那就厉害咯[偷笑]
    0 回复
  • @岁月小偷 十分感谢老哥的雪中送炭,这个table写的两篇文章解决我一年的痛点
    0 回复
  • @岁月小偷 这里不知道是不是我理解有问题,业务场景:筛选重置功能,如果调用reload不管是重载还是重新请求都会合并以前的config
    0 回复
  • 加个 前置回调 beforeSort参数,改一处就可以了,然后自己在 beforeSort里面进行数据请求和排序
    0 回复
  • @帅不过十秒 不是很理解你说的情况,筛选重置是?具体代码是什么?正常reload合并前的代码这个逻辑是正常的。
    0 回复
  • @岁月小偷 排序问题非常容易解决,改table.js,在内置sort调用前加一句代码,检查一下是否有 beforetSort参数传入,如果有就调用并判断返回值,如果是返回false就直接return;
    然后自己在beforeSort中处理一下,非常简单,比较麻烦的是 重载闪屏问题,看你另一个帖子似乎是很好解决了?
    可惜我用不了
    0 回复
  • @岁月小偷 感谢大神,这两个帖子解决我一年的痛点,希望 @贤心 能尽快加入到下个版本,测试没发现问题
    0 回复
  • @帅不过十秒 不客气[微笑]
    0 回复
  • 第一次开发,最近两个帖子都很好用啊,都用上了
    这篇暂时用不上,收藏先
    多谢楼主,多谢闲心
    0 回复
  • 易
    2018-9-16
    牛!

    排序直接去掉前端方式吧,在实际开发中,几乎没有前端排序的需求,就算需要,也要彻底跟后端排序分离。
    0 回复
  • 0 回复
  • @ 嗯嗯,[微笑]
    0 回复
  • Pojin
    2018-9-16
    good job
    0 回复
  • 大神收下我的膝盖····[威武]
    0 回复
  • @BUG开发工程师 @Pojin 谢谢支持[微笑]
    0 回复