layUI表格分页插件

大部分代码转自layUI社区   《嘉文》   道友的自定义分页插件

随后我增加了CheckBox选中行功能,并完善了一些《嘉文》道友没有明确指出的部分用法。

layui.define(['form','jquery', 'laypage'], function (exports) {
    var $ = layui.jquery, laypage = layui.laypage,form = layui.form();
    $.fn.jfTable = function (_opt, args) {
        if (typeof _opt == "string") {//判断是方法还是对象
            return JfTable.methods[_opt](this, args);
        }
        _opt = _opt || {};
        return this.each(function () {
            var grid = $.data(this, "jfTable");
            if (grid) {
                _opt = $.extend(grid.options, _opt);
                grid.options = _opt;
            } else {
                grid=new JfTable(this,_opt);
                $(this).data('jfTable',grid);
            }
        });
    }


    var JfTable=function (element,option) {
        this.$element=$(element);
        if(option.select){
            option.columns.unshift({
                type:'check',
                width: 50
            });
        }
        this.option= $.extend({},JfTable.default1, option);
        this.init();
        if(option.page){
            this.$page=$("<div class='page-bar'></div>").insertAfter(this.$element);
            this.initPage();
        }
    }

    JfTable.prototype.init=function () {
        $("<table class='layui-table'></table>").appendTo(this.$element.html(""));
        if(this.option.url){
            this.ajaxData();
        }
        this.initBody();
        this.initToolbar();
    };

    JfTable.prototype.initEvent=function () {
        var t=this,_opt=t.option;
        if(_opt.select){
            form.render("checkbox");
            form.on('checkbox(allChoose)', function(data){
                var child = $(data.elem).parents('table').find('tbody input[type="checkbox"]');
                child.each(function(index, item){
                    item.checked = data.elem.checked;
                });
                form.render('checkbox');
            });
        }
    }
    //初始化选中行事件
    JfTable.prototype.initCheckbox=function(){
    	var t=this,_opt=t.option;
    	//获取tr的点击事件
    	 $("tbody tr").click(function() {
    		 	var checkbox = $(this).find(":checkbox").attr("checked");
    		 	//由于重复使用渲染,导致重复点击行后会加载不出来样式,所以此处使用removeClass和addClass来操作
    			if(checkbox){     
    			  	$(this).find(":checkbox").attr("checked",false)
    			  	$(this).find(":checkbox").next().removeClass("layui-form-checked");
    			}else{     
    			 	 $(this).find(":checkbox").attr("checked",true)
    			 	 $(this).find(":checkbox").next().addClass("layui-form-checked");
    			}     
    		});
    	   
    }


    //生成工具栏
    JfTable.prototype.initToolbar=function () {
        var t=this,$e=t.$element,_opt=t.option,toolbar=_opt.toolbar,tool= $("<div class='layui-btn-group'></div>").prependTo($e);
        $.each(toolbar,function (index,item) {
            var btn=$("<button class='layui-btn "+_opt.toolbarClass+"'></button>").appendTo(tool);
            if(item.icon){
                $("<i class='layui-icon'>"+item.icon+"</i>").appendTo(btn);
            }else{
                btn.append(item.text);
            }
            btn[0].οnclick=eval(item.handle||function (){});//绑定匿名事件
        });
    }

    JfTable.prototype.initPage=function () {
       var t=this,opt=t.option, page=t.$page;
        laypage({
            cont: page,
            curr: opt.curr,
            pages:opt.pages,
            groups: 5,
            jump: function (obj,s) {
                t.option.queryParam=$.extend(opt.queryParam,{pageNumber:obj.curr});
                if(!s){
                    t.init();
                }
            }
        });
    }

    JfTable.prototype.initBody=function () {
        var t=this,$e=t.$element,opt=t.option,col=opt.columns,dt=opt.data,
            $table=$e.find("table").html(""),
            $cg=$("<colgroup></colgroup>").appendTo($table),
            $th=$("<thead></thead>").appendTo($table),
            $thr=$("<tr></tr>").appendTo($th),
            $tb=$("<tbody></tbody>").appendTo($table);
        $tb.html("");
        if(opt.select){
            $table.wrapAll("<div class='layui-form'></div>");
        }
        //遍历创建表头
        for(var i=0,l=col.length;i<l;i++){
            var c=col[i];
            i==(l-1)?$("<col>").appendTo($cg):$("<col width='"+c.width+"'>").appendTo($cg);
            c.type=='check'?$("<th><input type='checkbox' lay-skin='primary' lay-filter='allChoose'></th>").appendTo($thr):$("<th>"+c.text+"</th>").appendTo($thr);
        }

        //生成tbody  表格体
        for(var i=0,l=dt.length;i<l;i++){
            var d=dt[i],$tr=$("<tr></tr>").appendTo($tb);
            //取出对应列值
            for(var j=0,cl=col.length;j<cl;j++){
                var c=col[j],v=d[c.name],f=c.formatter;
                if(c.type=='check'){
                    $("<td><input type='checkbox' value='"+i+"' lay-skin='primary'></td>").appendTo($tr);
                    continue;
                }
                if(typeof f == "function"){
                    v=f(v,d,i);
                }
                $("<td>"+v+"</td>").appendTo($tr);
            }
        }
        opt.onLoadSuccess(dt);
        if(opt.select){
            t.initEvent();
            t.initCheckbox();
        }
    }

    JfTable.prototype.ajaxData=function () {
        var opt=this.option,param=$.extend({},opt.queryParam,{pageSize:opt.pageSize}),
            result=$.ajax({
                url: opt.url,
                method:opt.method,
                data:opt.onBeforeLoad(param),
                async:false
            }).responseJSON;
        var json=JSON.parse(result.data);  
        opt.dataFilter(result);
        if(opt.page){
            opt.pages=json.totalPage;
            opt.curr=json.pageNumber;
        }
        opt.data= json.list;
    }

    JfTable.methods={
        option: function (jq) {
        	//取出该table的option属性
        	return $.data(jq[0], "jfTable").option;
        },
        insertRow: function (jq, row) {
        	//插入一行
            var s=$.data(jq[0],"jfTable"),opt=s.option;
            opt.data.unshift(row);
            s.initBody();
        },
        getRow: function (jq, args) {
        	//获取制定行的数据  返回row行数据
            var s=$(jq[0]).jfTable('option');
            return s.data[args];
        },
        reload: function (jq, param) {
        	//重新根据param加载,param可以自定义,其中包含了初始化的参数
        	//参数格式
        	//{
        		//index:1,//索引
        	    //row:{  //数据
        	    //}
        	//}
            var t=$.data(jq[0],"jfTable"),opt=t.option;
            opt.queryParam=$.extend({},opt.queryParam,param);
            t.init();
            if(opt.page){
                t.initPage();
            }
        },
        updateRow:function (jq,param) {
        	//更新指定行的数据
            var s=$.data(jq[0],"jfTable"),opt=s.option;
            opt.data[param.index]=param.row;
            s.initBody();
        },
        getSelected:function (jq) {
        	//获取选中行,返回数组['0','1']
           var s = $(jq[0]).find("table.layui-table tbody .layui-form-checked"),r=[];
           for(var i=0,l=s.length;i<l;i++){
               var index=$(s[i]).prev().val();
               r[i]=this.getRow(jq,index);
           }
           return r || undefined;
        }

    };
    JfTable.default1={
        columns: [],
        url: null,
        data:[],
        method:"get",
        select:false,
        toolbar:[],
        pageSize:20,
        queryParam: {},
        onBeforeLoad: function (param) {
        	//加载前事件,参数为table获取url数据发送的参数
            return param;
        },
        onLoadSuccess: function (data) {
        	//加载成功后触发,参数是数据体
            return data;
        },
        dataFilter:function (res) {
        	//数据过滤事件,参数是url的响应体
            return res;
        }
    };

    exports('jfTable', {});
});




以上为jfTable.js  使用layUI 的朋友们放到modules文件夹下,或者是另一目录



然后在layUI.js 中 的modules中添加对应的引用


加载完后,我们随机就可以在页面中调用了


记得引用哦

使用方法如下:


layui.use(['element','laypage', 'layer','jquery','laytpl','form','layedit', 'laydate','jfTable'], function(){
  var laypage = layui.laypage
  ,layer = layui.layer
  ,$ = layui.jquery
  ,laytpl = layui.laytpl
  ,form = layui.form()
  ,layedit = layui.layedit
  ,laydate = layui.laydate;
  var config = {
	        url:"${ctx}/member/getList",//获取数据的url
	        queryParam: {},//查询参数
	        page:true,//是否分页
	        pageSize:10,//每页数量
	        select:true,//是否生成checkbox
	        columns: [ 
	                   {text:'昵称',name: 'nickName',width: 100,formatter:function(value,row,index){return value;}},
	                   {text:'电话',name: 'phone',width: 100,formatter:function(value,row,index){return value;}},
	                   {text:'用户类型',name: 'userType',width: 100,formatter:function(value,row,index){return value;}}
	                   ],
	        method:"post",//请求方式
	        onBeforeLoad: function (param) {
	            return param;
	        },
	        onLoadSuccess: function (data) {
	            return data;
	        },
	        dataFilter:function (data) {
	            return data;
	        }
	            
	    }
  		$("#table").jfTable(config);//config
});
  

页面中只需要定义一个ID为table的div即可使用了

<div id="table"></div>
那么我们需要在后台指定的格式又是什么呢。当时我就在这里懵逼了,因为《嘉文》道友并没有说明后台需要返回的什么格式。然后我就去断点找啊找

{"totalPage":3,"pageNumber":1,"list":[{"nickName":"小明","phone":"18101051555","userType":"管理员"}]}


totalPage 总页数
pageNumber当前页
list为数据

嘉文道友的说明文档我也发上来大家不懂得可以看下

# jfTable 使用说明


---


>jfTable基于layui实现的一个table插件,能够自动生成一个数据表格
>内置分页以及按钮功能,实现方法大致参考easyui的datagrid
>功能还在完善,喜欢的朋友多多提提意见,工作之余我尽量多完善,因为是基于layui的,所以必须要使用layui的方式去使用它


>这个小东西也是我之前没事的时候对着easyui的datagrid的源码研究了一通,然后又想学着layui的使用方法做了个练手的东西。
>很多地方不合理我也明白,希望大家多提点提点,js我也只会些粗浅的东西


###效果演示
![效果演示](http://git.oschina.net/uploads/images/2017/0401/142909_f2175c5f_417829.png "效果演示")




###1 配置说明
使用方法


    <div id="table"></div>
    var config={} $("#table").jfTable(config);//config参考下面进行配置


 
        
      var config = {
        url:"",//获取数据的url
        data:[],//本地数据  不支持本地数据的分页
        queryParam: {},//查询参数
        page:true,//是否分页
        pageSize:10,//每页数量
        select:true,//是否生成checkbox
       
        columns: [ {//列数组
                text:'用户名',//显示的表头
                name: 'username',//显示的数据key
                width: 100,//宽度
                formatter:function(value,row,index){//value 当前值  row 当前行数据  index 当前行索引
                }
            }],
        method:"post",//请求方式
        toolbarClass:"layui-btn-small",//按钮的样式
        toolbar:[{//按钮数组
                text:"新增",//icon缺省时显示
                icon:"&#xe654;",//按钮图标(如果不为空则显示按钮不显示text)
                handle:function () {//绑定函数
    
                }
            }],
        //事件   一定要return 
        onBeforeLoad: function (param) {
            return param;
        },
        onLoadSuccess: function (data) {
            return data;
        },
        dataFilter:function (data) {
            return data;
        }
            
    }






### 2 目前实现的方法
####2.1 option  //无参数
取出该table的option属性


####2.2 reload (param)
重新根据param加载,param可以自定义,其中包含了初始化的参数


####2.3 insertRow(row)
插入一行


####2.4 getRow(index)
获取制定行的数据  返回row行数据




####2.5 update(data{index:1,row{}})
更新指定行的数据
参数格式
```
{
    index:1,//索引
    row:{  //数据
        
    }
}
```


####2.6 getSelected  //无参数
获取选中行,返回数组['0','1']




### 3 事件(自定义事件一定要写返回)


####3.1 onBeforeLoad(param)
加载前事件,参数为table获取url数据发送的参数


####3.2 onLoadSuccess(data)
加载成功后触发,参数是数据体


####3.3 dataFilter(res)
数据过滤事件,参数是url的响应体




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现layui数据表格分页功能,需要结合PHP后端来进行处理。 首先,我们需要在PHP中获取到要展示的数据,并将其按照layui数据表格的要求进行格式化。可以使用数据库查询语句或者其他方式获取数据,然后将数据转换成JSON格式。 接下来,在HTML页面中引入layui的插件和样式表。在数据表格的设置项中,我们需要设置表格的列数、列名和数据接口等。 在PHP中,我们需要根据前端传递的参数,来确定当前请求的是第几页的数据。可以使用$_GET或$_POST来获取前端传递的参数,并进行相应的处理。根据当前页码和每页显示的数据条数,计算出开始查询的位置和查询的数据数量。 我们可以使用PHP的分页查询语句,例如LIMIT来实现分页功能。在查询数据的SQL语句中,添加LIMIT关键字,并将开始位置和数量作为参数传入。这样就可以获取到当前页的数据。 然后,将查询到的数据按照layui数据表格要求进行格式化,并返回给前端页面。 在前端页面中,layui会自动根据返回的数据进行渲染和分页展示。我们只需要在数据表格的设置项中,设置一页显示的数据条数和总数据条数。 总之,实现layui数据表格分页功能需要通过PHP后端来进行数据查询和分页处理,并将处理好的数据返回给前端页面。在前端页面中,通过引入layui的插件和设置相应的参数,即可实现分页展示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值