双表头列隐藏必须通过setColsStatus或动态重载cols实现,外层合并列不可设hide,仅内层带field的列可控制显隐,直接修改cols属性无效。
双表头本身不支持列条件隐藏,二者需拆解处理:双表头靠 cols 嵌套实现,列显隐必须走 table.setcolsstatus 或动态重载 cols,硬塞样式或 dom 操作会失效或错位。
双表头结构怎么写才兼容列控制
Layui 的双表头是通过 cols 数组嵌套两层实现的,比如第一行合并列、第二行细分列。但要注意:setColsStatus 只认最内层列的 field,外层无 field 的合并标题(如“用户信息”)不能被单独隐藏。
- 所有需要控制显隐的列,必须定义
field且唯一,放在最内层数组中 - 外层合并列只能用
title+colspan/rowspan,不能带hide或参与状态管理 - 若某列属于双表头下的子列(如“用户信息 > 用户名”),它的
field: 'username'就是唯一操作标识,和单表头一样使用 - 不要在双表头里给外层项加
hide: true—— 渲染时会被忽略,还可能破坏结构
列根据条件隐藏的两种可靠路径
条件隐藏不能依赖渲染后 jQuery 找 DOM 加 display:none,那样只藏内容、不缩列宽,还会导致导出异常、响应式错乱。真正生效的方式只有两个:
-
方式一(推荐):用
table.setColsStatus—— 适用于 v2.8+,表格已初始化后动态切换。调用前确保defaultToolbar: true已启用,且field与定义完全一致。例如:table.setColsStatus('myTable', 'email', false)隐藏邮箱列 -
方式二:动态重载
cols—— 适合初始化或条件变化较大时。先按后台返回的可见字段过滤原始cols,再调用table.reload('myTable', { cols: newCols })。注意:双表头需完整保留外层结构,只过滤内层含field的列项
为什么直接改 cols[0][i].hide 不起作用
很多人试过在 done 回调里写 table.config.myTable.cols[0][2].hide = true,发现没反应。这是因为:
- Layui 不监听
cols数组属性的变更,改了只是改了配置快照,不触发视图更新 - 双表头下
cols[0]是外层,cols[0][1]才是内层列数组,索引容易错位 - 即使改对了,也得手动调用
table.resize('myTable')或table.reload才能生效,不如直接走官方 API - 用
setColsStatus是唯一被框架认可的运行时列状态变更方式,它内部会同步宽度、重排 DOM、适配导出逻辑
隐藏后导出仍含数据?这是默认行为
无论列是否隐藏,table.exportFile() 默认导出的是原始数据源全字段,和 hide 或 setColsStatus 无关。如果要导出与当前视图一致:
- 导出前手动过滤
table.cache['myTable'](仅当前页)或重新请求全量数据 - 用
exportFile的data参数传入已按 visible columns 过滤后的数组 - 别指望
export: false或列配置里的非标准属性——Layui 原生不支持 per-column 导出开关
双表头叠加条件隐藏,核心就两点:结构上外层只负责分组,控制权全交给内层 field;逻辑上放弃 DOM 操作,只用 setColsStatus 或 reload(cols)。否则看似隐藏了,实际列宽卡着、导出漏字段、移动端横向滚动异常,问题会集中爆发在上线后。


















