动态加列必须用 table.reload() 传入新 cols 数组,不能直接改 layui.table.config.cols;需确保数据含对应字段、调用 resize() 刷新视图,并注意 fixed 列不可动态添加。
直接改 layui.table.config.cols 不生效?别碰它
动态加列不能靠修改原始配置对象,layui.table 初始化后会深拷贝 cols,后续对原配置的任何改动都无效。必须走「重载」流程——但不是全表重载,而是用 table.reload() 传入新列配置。
用 table.reload() 增加一列的正确姿势
核心是把原有列数组取出,push 新列定义,再传给 reload。注意三点:保留原 id(否则无法识别表格实例)、不改 data(避免重复请求)、只更新 cols:
const ins = table.get('your-table-id');
const currCols = layui.table.config.cols['your-table-id'][0]; // 假设只有一级表头
currCols.push({
field: 'new_field',
title: '新增列',
width: 120,
unresize: true
});
table.reload('your-table-id', {
cols: [currCols],
done: function(res, curr, count) {
// 可选:手动触发一次 resize 让列宽自适应(尤其加在末尾时)
layui.table.resize('your-table-id');
}
});
- 必须确保
table实例已存在且id匹配,否则get()返回undefined - 如果用了多级表头(
children),要递归找到目标层级再push,不能直接操作顶层[0] -
reload会触发done回调,但不会重新拉取数据;若需同步新字段数据,得自己补到data或后端配合
新加的列没数据显示?检查字段是否在原始 data 中
table 渲染列时,只按 field 去每行数据里取值。如果原始 data 数组里没有对应字段,那一列就为空。解决方式分两种:
- 前端补字段:
table.cache['your-table-id'].forEach(row => row.new_field = '默认值');,再调reload - 后端补字段:在接口返回的每条记录中加入该字段(更推荐,避免前端维护数据结构)
- 用
templet渲染计算值(如拼接两个已有字段):不需要后端提供,但字段名仍需存在或设为''
为什么加完列后宽度错乱、拖拽失效?
常见于未调用 layui.table.resize(),或新列 width 设置不合理(比如总宽超容器、设了 0 或负数)。另外注意:
-
resize()必须在reload的done回调里调,否则 DOM 还没更新 - 如果表格启用了
autoSort: true,新增列默认不可排序,需显式加sort: true并实现event或后端排序逻辑 - 使用
fixed: 'right'的列不能动态添加,固定列必须初始化时定义
cols 就完事,忘了数据源里压根没有那个字段。











