From bc61f9ff08d4e512585b399c0dd41954c3878bd0 Mon Sep 17 00:00:00 2001 From: sight <26325820+Sight-wcg@users.noreply.github.com> Date: Sat, 13 Jan 2024 10:18:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(table):=20=E6=96=B0=E5=A2=9E=20`table.upda?= =?UTF-8?q?teTotalRow`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/table/index.md | 60 ++++++++++++++++++++++++-------------------- src/modules/table.js | 29 ++++++++++++++++----- 2 files changed, 56 insertions(+), 33 deletions(-) diff --git a/docs/table/index.md b/docs/table/index.md index b90bc51c..13adfece 100644 --- a/docs/table/index.md +++ b/docs/table/index.md @@ -314,6 +314,38 @@ data.splice(newIndex, 0, item[0]); table.renderData('test'); ``` +

更新合计行 2.9.4+

+`table.updateTotalRow(id, totalRowData);` +- 参数 `id` : table 渲染时的 `id` 属性值 +- 参数 `totalRowData` : 合计行数据,未传入时,将使用内置的前端自动合计。若为函数,则为计算每一列数据的回调 + +```js +// 渲染 +table.render({ + elem: '', // 绑定元素选择器 + id: 'test', // 自定义 id 索引 + // 其他属性 … +}); + +// 内置前端自动合计 +table.updateTotalRow('test'); + +// 传入合计行数据,建议采用后端合计时使用 +table.updateTotalRow('test', { + score: 100, + count: 20 +}); + +// 自定义合计行计算,建议采用前端合计时使用 +table.updateTotalRow('test', function(field, columnValues, tableData){ + if(field === 'score') { + return columnValues.reduce(function(accumulator, currentValue){ + return accumulator + currentValue; + }); + } +}); +``` +

更新指定行数据 2.9.4+

`table.updateRow(id, opts);` @@ -336,7 +368,7 @@ table.render({ // 其他属性 … }); -// 更新单行 +// 更新指定行数据 table.updateRow('test', { index: 0, row: { @@ -344,32 +376,6 @@ table.updateRow('test', { username: 'name' } }); - -// 更新多行 -table.updateRow('test', [ - { - index: 0, - row: { - id: 1, - username: 'name1' - } - }, - { - index: 1, - row: { - id: 2, - username: 'name2' - } - } -]); - -// 更新单元格 -table.updateRow('test', { - index: 0, - row: { - username: 'name' - } -}) ```

获取选中行

diff --git a/src/modules/table.js b/src/modules/table.js index 160a8921..fdeaa123 100644 --- a/src/modules/table.js +++ b/src/modules/table.js @@ -1410,6 +1410,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){ var that = this; var options = that.config; var totalNums = {}; + var columnValues = {}; if(!options.totalRow) return; @@ -1423,6 +1424,9 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){ if(item3.totalRow){ totalNums[field] = (totalNums[field] || 0) + (parseFloat(content) || 0); + // 收集合计列的值 + if(!columnValues[field]) columnValues[field] = []; + columnValues[field].push(content); } }); }); @@ -1432,18 +1436,20 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){ var tds = []; that.eachCols(function(i3, item3){ var field = item3.field || i3; - // 合计数据的特定字段 - var TOTAL_NUMS = totalRowData && totalRowData[item3.field]; + var TOTAL_NUMS = (typeof totalRowData === 'function' && item3.totalRow) + ? totalRowData(field, columnValues[field], data) + : totalRowData && totalRowData[item3.field]; // 合计数据的小数点位数处理 var decimals = 'totalRowDecimals' in item3 ? item3.totalRowDecimals : 2; var thisTotalNum = totalNums[field] ? parseFloat(totalNums[field] || 0).toFixed(decimals) - : ''; + : ''; // td 显示内容 - var content = function(){ + // 如果直接传入了合计行数据,则不输出自动计算的结果 + var content = TOTAL_NUMS ? TOTAL_NUMS : function(){ var text = item3.totalRowText || ''; var tplData = { LAY_COL: item3 @@ -1458,8 +1464,7 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){ tplData: tplData }) || text) : text; - // 如果直接传入了合计行数据,则不输出自动计算的结果 - return TOTAL_NUMS || getContent; + return getContent; }(); // 合计原始结果 @@ -1512,6 +1517,18 @@ layui.define(['lay', 'laytpl', 'laypage', 'form', 'util'], function(exports){ that.layTotal.find('tbody').html('' + tds.join('') + (patchElem.length ? patchElem.get(0).outerHTML : '') + ''); }; + /** + * 更新合计行数据,未传入合计行数据时,将使用内置的自动合计 + * @param {string} id 表格 ID + * @param {Object. | ((field: string, columnValues: Array, tableData: Array) => string | number)} [totalRowData] - 合计行数据。若为函数,则为计算每一列合计数据的回调 + */ + table.updateTotalRow = function(id, totalRowData){ + var that = getThisTable(id); + + var data = table.cache[that.key] || []; //列表数据 + that.renderTotal(data, totalRowData) + } + //找到对应的列元素 Class.prototype.getColElem = function(parent, key){ var that = this;