layui的table前端分頁
阿新 • • 發佈:2020-11-24
最近一直在折騰報表,期間使用了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; } }); } }