layui table footerData不支持自动计算平均值,需在done回调中手动累加、清洗数据并赋值,且字段名与cols严格一致,否则显示异常或为空。
layui table 的 footerData 不支持直接算平均值,得手动算好再塞进去
layui 的表格 footer 行只认静态数据,footerdata 里填的值不会自动计算,更不会识别 "avg:price" 这种写法——那是某些商业表格库的语法,layui 没这功能。你看到 footer 里显示 nan 或空,大概率是往里塞了没算完的表达式或未定义变量。
实操建议:
- 在
done回调里遍历res.data,对目标字段(比如amount)累加并计数,算出平均值(注意除零) - 把结果构造成和表头字段顺序一致的对象,例如
{name: "合计", amount: 123.45},再赋给table.config.footerData - 调用
table.render()后,必须显式触发table.resize()或重绘,否则 footer 可能不更新
用 done 回调 + footerData 动态填平均值的典型写法
别在初始化时就写死 footerData,它得等真实数据回来才能算。重点在 done 函数体里操作:
table.render({
elem: '#demo',
url: '/api/list',
cols: [[
{field: 'name', title: '名称'},
{field: 'amount', title: '金额', sort: true}
]],
done: function(res, curr, count) {
// 手动算 amount 平均值
let sum = 0, len = res.data.length;
if (len === 0) return;
res.data.forEach(function(item) {
sum += parseFloat(item.amount) || 0;
});
const avg = parseFloat((sum / len).toFixed(2));
// 构造 footer 数据,字段名必须和 col 中 field 严格一致
this.config.footerData = [{
name: '平均值',
amount: avg
}];
}
});
字段类型不一致或含空值时,parseFloat 容易返回 NaN
后端返回的 amount 如果是字符串 "--"、null 或空格,parseFloat 会返回 NaN,一加就全毁。不能靠 try-catch,得前置清洗。
实操建议:
- 用正则先提取数字部分:
item.amount?.toString().match(/-?\d+\.?\d*/)?.[0],再转浮点 - 或者统一用
Number(item.amount),它对空字符串、null返回0,比parseFloat更可控 - 如果业务要求空值不参与平均(即分母只算有效项),就得单独统计有效个数,不能直接用
res.data.length
合计行样式错位或不显示?检查 footerData 和 cols 的字段对齐
footer 行本质是渲染一个独立的 <tr>,列数、<code>field 名、顺序必须和 cols 完全一致,漏一个或拼错一个,整行就会错位甚至空白。
常见错误现象:
-
footerData里写了amt,但表头field是amount→ 对应列为空 - 表头用了
templet渲染,但footerData直接填原始值 → 显示格式不一致(比如金额没加千分位) - 启用了
fixed: 'left'列,footer 行不会自动固定 → 需要额外 CSS 或放弃 fixed
复杂点在于:平均值本身没“单位”概念,但业务上常需标注“(元)”或保留小数位,这些都得在算完后手动拼进字符串里,footerData 不走模板,也不走格式化函数。










