layui表格开启合计行需设footer: true,done回调中遍历data求和并赋值给this.footerData,金额须转数字再格式化。

layui表格开启合计行需要手动配置 footer 区域
layui 的 table.render() 默认不自动计算合计,必须显式启用 footer: true,并配合 done 回调手动填充数据。很多人卡在没加 footer: true,导致 footerData 完全不渲染。
-
footer: true是开关,缺了 footer 区域压根不会生成 -
done回调里才能安全访问data(原始行数据),此时可遍历求和 - 合计行内容必须写进
footerData数组,且结构要和cols列定义严格对齐(长度、顺序一致)
金额列求和时要注意数值类型转换
后端返回的金额字段常是字符串(如 "12345.67"),直接 += 会拼接成字符串。必须用 parseFloat() 或 Number() 转为数字,否则合计结果是 "100020003000" 这种诡异值。
- 推荐用
Number(val) || 0处理空值或非法字符,避免NaN - 如果金额带千分位(如
"1,234.56"),先.replace(/,/g, '')清洗 - 不要在循环中反复调用
parseFloat后再格式化——先算总和,最后统一格式化
金额格式化用 toLocaleString 最省心
不用自己写正则或函数补零、加逗号。Number(val).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) 可直接输出 "1,234.56" 格式,且自动处理小数位对齐。
-
minimumFractionDigits: 2强制保留两位小数(100→"100.00") -
maximumFractionDigits: 2防止后端传入三位小数被放大显示 - 注意:IE 不支持该用法,若需兼容 IE,改用
moneyFormat(num)自定义函数
完整实操示例(关键片段)
table.render({
elem: '#demo',
url: '/api/list',
footer: true, // 必须开启
cols: [[
{field: 'name', title: '名称'},
{field: 'price', title: '单价', align: 'right'},
{field: 'qty', title: '数量', align: 'right'},
{field: 'total', title: '金额', align: 'right'}
]],
done: function(res, curr, count) {
let sumPrice = 0, sumQty = 0, sumTotal = 0;
res.data.forEach(row => {
sumPrice += Number(row.price) || 0;
sumQty += Number(row.qty) || 0;
sumTotal += Number(row.total) || 0;
});
// footerData 必须是二维数组,每项对应一行,内部数组长度=列数
this.footerData = [[
'合计',
sumPrice.toLocaleString('zh-CN', {minimumFractionDigits: 2, maximumFractionDigits: 2}),
sumQty,
sumTotal.toLocaleString('zh-CN', {minimumFractionDigits: 2, maximumFractionDigits: 2})
]];
}
});
最后一行容易被忽略:layui 的 footerData 是实例属性,必须通过 this.footerData = [...] 赋值,不能写成 table.footerData = [...] —— 因为 done 回调里的 this 指向当前 table 实例,而外部没有这个引用。


















