1. 程式人生 > 實用技巧 >layui的table前端分頁

layui的table前端分頁

最近一直在折騰報表,期間使用了layui的table做展示(版本號:2.5.5)

起初:以為是查詢結果出來後,前端和服務端分頁一弄就完事了,參考例子,但是sql寫得太長太長了,翻頁困難,資料庫是老舊的SqlServer2008 R2

接著:開始改造,由於查詢出來的資料量不是很大,約在10w以內,於是開始【一次請求,前端自己分頁】的思路,瀏覽器還是很強大的

$.ajax({
                type: "post",
                url: "請求地址", 
                async: true,
                data: {
                    //查詢條件
                },
                success: function (res) {
                    sourceData = res.data;
                    pageData = res.data;
                    let new_data = $.extend(true, [], res.data);
                    tableIns=table.render({
                        elem: '#dataTable'
                        , id: 'dataTable'
                        , height: height
                        , loading: true
                        , title: tbTitle
                        , autoSort: false //手動排序
                        , page: true
                        , limit: m_limit
                        , limits:[50,100,200,300]
                        , toolbar: '#toolbar'
                        , defaultToolbar: ['filter', 'print']
                        , cols: [[
                        { field: '序號', title: '序號', width: 70, fixed: 'left', type: 'numbers' }
                        //需要顯示的列
                            ]]
                        , data:new_data
                        , done: function () {
                            searchPage();
                        }
                    });
                }
            })

利用table的data屬性進行資料的賦值,完成前端的分頁。拉了生產大概八九萬的資料測試展示,沒有卡頓,(本機8G記憶體,i5 4核,普通使用者機器4G)

之後:因為還想提供前端的本地搜尋功能,完善了searchPage()函式,隨意使用一個輸入框

        function searchPage() {
            $("#Keyword").keydown(function (e) {
                var curKey = e.which;
                if (curKey == 13) {
                    var loading = layer.load(2, {
                        content:'搜尋中...',
                        shade:  [0.3, '#393D49'],time: 3 * 1000
                    });
                    var Keyword = $('#Keyword').val();
                     Keyword = trim(Keyword);
                    pageData = array_search(sourceData, Keyword);
                    let new_data = $.extend(true, [], pageData);    
                    table.reload('dataTable', { data: new_data });
                    layer.close(loading);
                    $('#Keyword').val(Keyword);
                }
            });
        }

核心搜尋函式array_search(),查詢匹配的資料

/*
* js array_searcy() 函式
* @param array 必選引數 要查詢的陣列或物件
* @param find 必須引數 要查詢的內容
*/
function array_search(array, str) {
    if (typeof array !== 'object') {
        return false;
    } else {
        var found = [];
        for (var i = 0; i < array.length; i++) {
            for (var j in array[i]) {
                var value = array[i][j]+'';//轉化為字串
                if (value.indexOf(str) >= 0) {
                    found.push(array[i]);
                    break;
                }
            }
        }
        return found;
    }
}
//去左空格;
function ltrim(s) {
    return s.replace(/(^\s*)/g, "");
}
//去右空格;
function rtrim(s) {
    return s.replace(/(\s*$)/g, "");
}
//去左右空格;
function trim(s) {
    return s.replace(/(^\s*)|(\s*$)/g, "");
}

小細節擴充套件:如果想excel匯出可以使用前端匯出,但是資料量大的時候,會卡死瀏覽器,無法非同步(也考慮使用woker物件,但還是不好弄,一些資訊和元件無法在woker裡面使用)

後續:增加了一個前端排序,自帶的排序autoSort需要關閉(原排序只針對當前頁排序,適合後端前端聯動排序)

        table.on('sort(dataTable)', function (obj) {
            //console.log(obj.field); //當前排序的欄位名
            //console.log(obj.type); //當前排序型別:desc(降序)、asc(升序)、null(空物件,預設排序)
            let sortSourceData = $.extend(true, [], sourceData);
            let sortType = "";
            switch (obj.field) {
                case '需要排序的欄位'://需注意在field繫結的時候開啟sort
                    sortType = "number"; break;
            }
            tableSort(sortSourceData, obj.field, obj.type, sortType);
            //console.log(sortSourceData);
            //console.log(sourceData);
            table.reload('dataTable', {
              initSort: obj //記錄初始排序,如果不設的話,將無法標記表頭的排序狀態。
              ,where: { //請求引數(注意:這裡面的引數可任意定義,並非下面固定的格式)
                field: obj.field //排序欄位
                ,order: obj.type //排序方式
              },data: sortSourceData
            });
        });

核心函式tableSort(),利用array自帶的sort進行擴充套件

//asc 升序
//desc 降序
/**
 * @tableObj 表
 * @field 欄位
 * @orderBy 排序方式
 * @sortType 排序是型別
 */
function tableSort(tableObj, field, orderBy, sortType) {
    var type = 'number';
    if (sortType == null && tableObj.length > 0) {
        type = typeof(tableObj[0][field]);
    } else {
        type = sortType;
    }
    if (orderBy == 'desc') {
        return tableObj.sort(function (a, b) {
            var x = a[field];
            var y = b[field];
            switch (type) {
                case 'number':
                    if (x == null) {
                        x = 0;
                    }
                    if (y == null) {
                        y = 0;
                    }
                    return x - y;
                case 'string':
                    if (x == null || x == '') {
                        x = 0;
                    } else {
                        x = x.charCodeAt(0);
                    }
                    if (y == null || y == '') {
                        y = 0;
                    } else {
                        y = y.charCodeAt(0);
                    }
                    return x- y;
                case 'datetime':
                    if (x == null) {
                        x = 0;
                    } else {
                        x = new Date(x).getTime();
                    }
                    if (y == null) {
                        y = 0;
                    } else {
                        y = new Date(y).getTime();
                    }
                    return x - y;
            }
        });
    } else if (orderBy == 'asc') {
        return tableObj.sort(function (a, b) {
            var x = a[field];
            var y = b[field];
            switch (type) {
                case 'number':
                    if (x == null) {
                        x = 0;
                    }
                    if (y == null) {
                        y = 0;
                    }
                    return y - x;
                case 'string':
                    if (x == null || x == '') {
                        x = 0;
                    } else {
                        x = x.charCodeAt(0);
                    }
                    if (y == null || y == '') {
                        y = 0;
                    } else {
                        y = y.charCodeAt(0);
                    }
                    return y - x;
                case 'datetime':
                    if (x == null) {
                        x = 0;
                    } else {
                        x = new Date(x).getTime();
                    }
                    if (y == null) {
                        y = 0;
                    } else {
                        y = new Date(y).getTime();
                    }
                    return y - x;
            }
        });
    }
}