JavaScript

超轻量级php框架startmvc

layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法

更新时间:2020-09-14 19:36:01 作者:startmvc
在做数据表格的时候遇到了很多坑,今天整理一下方便以后使用.主要功能是使用数据表格,做

在做数据表格的时候遇到了很多坑, 今天整理一下方便以后使用.

主要功能是使用数据表格, 做分页,做搜索, 还有checkbox, 支持全选.

当选中一些数据的时候, 数据切换页面数据在切换回来后,选中状态就消失了, 我们希望切换回来的时候, 选中状态还能存在, 因此做了个缓存, 使checkbox 保持选中状态.代码如下:

1.HTML 搜索输入框


<form class="layui-form">
 <div class="layui-input-inline">
 <input type="tel" name="searContent" autocomplete="off"
 placeholder="姓名/手机/身份证" class="layui-input">
 </div>
</form>

2.HTML 搜索按钮


<div class="layui-input-inline " style="width: 90px">
 <button class="layui-btn" id="searchEmailCompany" data-type="reload">
 <i class="layui-icon" style="font-size: 20px; "></i> 搜索
 </button>
</div>

3.HTML table表格


<div class="yys-fluid yys-wrapper">
 <div class="layui-row lay-col-space20">
 <div class="layui-cos-xs12 layui-col-sm12 layui-col-md12 layui-col-lg12">
 <section class="yys-body animated rotateInDownLeft">
 <div class="yys-body-content clearfix changepwd">
 <div class="layui-col-lg12 layui-col-md10 layui-col-sm12 layui-col-xs12" style="width:100%">
 <div class="user-tables">
 <table id="userTables" lay-filter="userTables"> </table>
 </div>
 </div>
 </div>
 </section>
 </div>
 </div>
 </div>
</div>

4.HTML 时间格式转换


<script type="text/html" id="TimeTpl">
 {{#
 var parseDate= function(date){
 if(date){
 var t=new Date(date);
 return t.getFullYear()+"-"+(t.getMonth()+1)+"-"+t.getDate()+" "+t.getHours()+":"+t.getMinutes();
 }
 }
 }}
 {{parseDate(d.updateTime)}}
</script>

5. js 功能设定


<script>
 var $ = null;
 layui.use(["jquery", "upload", "form", "table", "layer", "element", "laydate"], function () {
 $ = layui.jquery;
 var element = layui.element,
 layer = layui.layer,
 upload = layui.upload,
 form = layui.form,
 laydate = layui.laydate,
 table = layui.table;
 //记录选中的数据:做缓存使用,作为参数传递给后台,然后生成pdf ,压缩
 var ids =new Array();
 //当前表格中的全部数据:在表格的checkbox全选的时候没有得到数据, 因此用全局存放变量
 var table_data=new Array();
 
     var a = table.render({
 elem: "#userTables",
 skin: 'line', //行边框风格
 cols: [[
 {checkbox: true, width: 60, fixed: true},
 {type: 'numbers', title: '序号', width: '40'},
 {
 field: "name",
 width: 80,
 title: "姓名",
 align: "left"
 }, {
 field: "phone",
 width: 120,
 title: "电话",
 align: "left"
 }, {
 field: "identificationNuber",
 width: 170,
 title: "身份证号码",
 align: "left"
 }, {
 field: "updateTime",
 width: 140,
 title: "更新时间",
 align: "left",
 templet: '#TimeTpl'
 }, {
 title: "常用操作",
 width: 200,
 align: "left",
 toolbar: "#userbar",
 fixed: "right"
 }]],
 url: "/user/getReportList",
// data: userData,
 page: { //分页设定
 layout: ['count', 'prev', 'page', 'next'] //自定义分页布局
 , curr: 1 //设定初始在第 1 页
 , limit: 10//每页多少数据
 , groups: 5 //只显示 5 个连续页码
 },
 even: true
 ,done: function(res, curr, count){
 //数据表格加载完成时调用此函数
 //如果是异步请求数据方式,res即为你接口返回的信息。
 //如果是直接赋值的方式,res即为:{data: [], count: 99} data为当前页数据、count为数据总长度

 //设置全部数据到全局变量
 table_data=res.data;
 
 //在缓存中找到id ,然后设置data表格中的选中状态
 //循环所有数据,找出对应关系,设置checkbox选中状态
 for(var i=0;i< res.data.length;i++){
 for (var j = 0; j < ids.length; j++) {
 //数据id和要勾选的id相同时checkbox选中
 if(res.data[i].id == ids[j])
 {
 //这里才是真正的有效勾选
 res.data[i]["LAY_CHECKED"]='true';
 //找到对应数据改变勾选样式,呈现出选中效果
 var index= res.data[i]['LAY_TABLE_INDEX'];
 $('.layui-table-fixed-l tr[data-index=' + index + '] input[type="checkbox"]').prop('checked', true);
 $('.layui-table-fixed-l tr[data-index=' + index + '] input[type="checkbox"]').next().addClass('layui-form-checked');
 }
 }
 }
 //设置全选checkbox的选中状态,只有改变LAY_CHECKED的值, table.checkStatus才能抓取到选中的状态
 var checkStatus = table.checkStatus('my-table');
 if(checkStatus.isAll){
 $(' .layui-table-header th[data-field="0"] input[type="checkbox"]').prop('checked', true);
 $('.layui-table-header th[data-field="0"] input[type="checkbox"]').next().addClass('layui-form-checked');
 }
 //得到所有数据
 console.log(res);
 //得到当前页码
 console.log(curr);
 //得到数据总量
 console.log(count);
 }
 });

 //复选框选中监听,将选中的id 设置到缓存数组,或者删除缓存数组
 table.on('checkbox(userTables)', function (obj) {
 if(obj.checked==true){
 if(obj.type=='one'){
 ids.push(obj.data.id);
 }else{
 for(var i=0;i<table_data.length;i++){
 ids.push(table_data[i].id);
 }
 }
 }else{
 if(obj.type=='one'){
 for(var i=0;i<ids.length;i++){
 if(ids[i]==obj.data.id){
 ids.remove(i);
 }
 }
 }else{
 for(var i=0;i<ids.length;i++){
 for(var j=0;j<table_data.length;j++){
 if(ids[i]==table_data[j].id){
 ids.remove(i);
 }
 }
 }
 }
 }
 });

 //搜索加载--数据表格重载
 var $ = layui.$, active = {
 reload: function () {
 //执行重载
 table.reload('userTables', {
 page: {
 curr: 1 //重新从第 1 页开始
 }
 , where: {
 searContent: $("input[name=searContent]").val()
 }
 });
 }
 };


 $('#searchEmailCompany').on('click', function () {
 ids=new Array();
 var type = $(this).data('type');
 active[type] ? active[type].call(this) : '';
 });
 element.init();
 });

//删除数组自定义函数
 Array.prototype.remove=function(dx)
 {
 if(isNaN(dx)||dx>this.length){return false;}
 for(var i=0,n=0;i<this.length;i++)
 {
 if(this[i]!=this[dx])
 {
 this[n++]=this[i]
 }
 }
 this.length-=1
 }
</script>

6. 请求数据格式

//请求的数据格式


{
  "code":0,
  "count":39,
  "data":[
    {
      "id":57,
      "insertTime":1513578156000,
      "leaguerId":65,
      "phone":"1356***98907",
      "status":0,
      "updateTime":1513578156000,
      "uuid":"7c94e354-cd87-4ea7-bccf-2e115e1cbc49"
    },
    {
      "id":56,
      "identificationNuber":"652101**3*",
      "insertTime":1513578013000,
      "leaguerId":60,
      "name":"周*谨",
      "phone":"135**907",
      "status":0,
      "updateTime":1513578037000,
      "uuid":"ed91fac6-56f8-4771-aa79-32863a27bf6f"
    },
    {
      "id":55,
      "identificationNuber":"42098**",
      "insertTime":1513576647000,
      "leaguerId":60,
      "name":"董*",
      "phone":"1356**8908",
      "status":0,
      "updateTime":1513576729000,
      "uuid":"62d58c68-b49f-44f4-b5a3-e8ea629b5d32"
    },
    {
      "id":54,
      "identificationNuber":"6501**",
      "insertTime":1513576558000,
      "leaguerId":60,
      "name":"*光",
      "phone":"158009**059",
      "status":0,
      "updateTime":1513576590000,
      "uuid":"a65e3880-f44c-44cb-9f78-f7d7bbacee86"
    },

    {
      "id":53,
      "identificationNuber":"310114**",
      "insertTime":1513576261000,
      "leaguerId":60,
      "name":"吴*雯",
      "phone":"137**5261",
      "status":0,
      "updateTime":1513576294000,
      "uuid":"6a0766f1-da1d-4c55-8bd5-5dd7a6ad7cd3"
    },
    {
      "id":52,
      "identificationNuber":"3201**",
      "insertTime":1513574849000,
      "leaguerId":65,
      "name":"*骏",
      "phone":"186**9521",
      "status":0,
      "updateTime":1513574998000,
      "uuid":"89f1fddf-d3c2-4a3b-8a13-c501bdb8e22c"
    },

    {
      "id":51,
      "insertTime":1513562761000,
      "leaguerId":63,
      "phone":"15655**110",
      "status":0,
      "updateTime":1513562761000,
      "uuid":"f4a3b875-d15c-423b-836b-9123cde96000"
    },
    {
      "id":49,
      "identificationNuber":"4210**",
      "insertTime":1513561354000,
      "leaguerId":63,
      "name":"余*",
      "phone":"1527**4673",
      "status":0,
      "updateTime":1513561843000,
      "uuid":"b38a8660-bf74-41b9-b01f-6e79189327a3"
    },
    {
      "id":50,
      "insertTime":1513561498000,
      "leaguerId":63,
      "phone":"186**59965",
      "status":0,
      "updateTime":1513561498000,
      "uuid":"445cd1dc-bd75-4a4e-933d-646e9823647a"
    },
    {
      "id":48,
      "insertTime":1513516215000,
      "leaguerId":63,
      "phone":"1356**8907",
      "status":0,
      "updateTime":1513516215000,
      "uuid":"706851f6-9243-4ea9-97eb-fc8e12c42c77"
    }
  ],
  "msg":""
}

//效果:

7.后台java

(1).controller


/**
 * 获取报告列表
 *
 *@return
 */
@RequestMapping(value = "/getReportList", method = {RequestMethod.GET})
@ResponseBody
public Map getReportList( Integer page , Integer limit ,String searContent) {
 logger.info("获取报告列表");
 if (SecurityUtils.getSubject().isAuthenticated() == false) {
 logger.error("未登录");
 return null;
 }
 System.out.println(searContent);
 Map<Object, Object> mapParameter = new HashedMap();
 mapParameter.put("page", (page-1)*10);
 mapParameter.put("limit", limit);
 mapParameter.put("searContent", searContent);
 try {
 List<Report> vReports=reportService.findReportList(mapParameter);
 Integer count=reportService.findReportListCount(mapParameter);
 Map<Object, Object> map = new HashedMap();
 map.put("code", 0);
 map.put("msg", "");
 map.put("count", count);
 map.put("data", vReports);
 return map;
 } catch (Exception e) {
 logger.error("获取报告列表 错误",e);
 }
 logger.error("获取报告列表");
 return null;
}

(2).Service


@Override
public List<Report> findReportList(Map mapParameter) {
 return reportDao.selectList("findReportList",mapParameter);
}
@Override
public Integer findReportListCount(Map mapParameter) {
 return reportDao.selectOne("findReportCount",mapParameter);
}

(3).mybatis SQL


<!-- 查询所有报告列表 -->
 <select id="findReportList" resultMap="BaseResultMap" parameterType="java.util.Map">
 select * FROM report where status=0
 <if test="searContent!=null ">
 and (
 (name LIKE concat(concat("%",#{searContent}),"%"))
 or (phone LIKE concat(concat("%",#{searContent}),"%"))
 or (identification_nuber LIKE concat(concat("%",#{searContent}),"%"))
 )
 </if>
 ORDER BY update_time DESC limit #{page} , #{limit};
 </select>
 <!-- 查询所有报告列表 总数 -->
<select id="findReportCount" resultType="java.lang.Integer" parameterType="java.util.Map">
 select COUNT(*) FROM report where status=0
 <if test="searContent!=null ">
 and (
 (name LIKE concat(concat("%",#{searContent}),"%"))
 or (phone LIKE concat(concat("%",#{searContent}),"%"))
 or (identification_nuber LIKE concat(concat("%",#{searContent}),"%"))
 )
 </if>
 ;
 </select>

BUG网友解决方案(未测):


//实例
 layui.use(['table','form'], function(){

 var form = layui.form; 
//form监听checkbox事件
 form.on('checkbox', function(obj){ 
 //当前元素
 var data = $(obj.elem);
 //遍历父级tr,取第一个,然后查找第二个td,取值 转换为Number
 var id = Number(data.parents('tr').first().find('td').eq(1).text());
 //选中or未选中
 var check = obj.elem.checked; 
 //复选框状态
 // var checkStatus = table.checkStatus('users');
 //如果选中
 if(check==true){ 
 //如果缓存数组存在值
 if(ids.length>0){ 
 //id==0便是全选按钮
 if(id==0){ 
 //循环当前页面所有数据
 for(var i=0;i<table_data.length;i++){ 
 //数据中有不存在于不在缓存中则加入缓存中 isInArray该方法来自common.js
 if(isInArray(ids,table_data[i].id)==false){
 ids.push(table_data[i].id); 
 }
 } 
 }else{
 //单选中的数据不在缓存中则加入缓存中
 if(isInArray(ids,id)==false){
 ids.push(id); 
 }
 }
 //如果缓存数组不存在值 表示第一次添加
 }else{ 
 //id==0便是全选按钮
 if(id==0){ 
 //循环当前页面所有数据直接加入缓存
 for(var i=0;i<table_data.length;i++){ 
 ids.push(table_data[i].id); 
 }
 }else{ 
 //单选中的数据加入缓存中
 ids.push(id); 
 } 
 } 
 //取消选中 
 }else{
 //id==0便是全选按钮
 if(id==0){
 //循环当前页面所有数据
 for(var i=0;i<table_data.length;i++){ 
 //如果有数据存在与缓存中则删除
 if(isInArray(ids,table_data[i].id)==true){
 //removeByValue该方法来自common.js
 ids.removeByValue(table_data[i].id); 
 }
 }
 }else{
 //如果单选中的数据存在与缓存中则删除
 if(isInArray(ids,id)==true){
 ids.removeByValue(id);
 }
 } 
 }
 }); 

})

//判断数组中是否存在元素 arr数组 value需判断的元素
function isInArray(arr, value) {
 for (var i = 0; i < arr.length; i++) {
 if (value === arr[i]) {
 return true;
 }
 }

 return false;
}

// 数组对象增加删除方法 数组.removeByValue(需删除的值)即可调用
Array.prototype.removeByValue = function(val) {
 for (var i = 0; i < this.length; i++) {
 if (this[i] == val) {
 this.splice(i, 1);
 break;
 }
 }
}

以上这篇layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

layui 分页 搜索 checkbox 缓存