动态隐藏列必须用 tableIns.reload({ cols: newCols }),newCols 为完整二维数组;合并单元格需在 done 回调中手动操作 DOM,且须先校验列可见性、重算索引,避免错位。
动态隐藏列必须用 reload,不能只改 cols 数组
直接修改 tableins.config.cols[0][n].hide = true 不会触发重绘,dom 保持原样。layui 的列渲染只在 render 或 reload 时读取配置,改完不 reload 就等于没改。
- 必须用
tableIns.reload({ cols: newCols }),且newCols是完整二维数组(如[[{field:'id'}, {field:'name', hide:true}]]),不能只传单列对象 - 深拷贝别用
JSON.parse(JSON.stringify(...))——templet函数、width、align等都会丢失;推荐用结构化遍历重建:rawCols.map(row => row.map(col => ({...col, hide: shouldHide(col.field)}))) - 如果表格启用了
autoSort: true,reload后排序状态清空,需手动保存initSort并传入reload的initSort参数 - 固定列(
fixed: 'left')设hide: true有效,但固定区宽度不会自动收缩,得额外调table.resize()
监听容器宽度变化要用 ResizeObserver,不是 window.onresize
window.onresize 太粗粒度,表格容器可能没变而窗口变了,频繁 reload 白耗性能;ResizeObserver 只响应目标容器尺寸变化,更精准。
- 监听对象必须是表格的**直接父容器**,不是
table元素本身(它会被 layui 动态替换):document.querySelector('#demo').parentElement - 判断阈值别硬写
768,建议用 CSS 自定义属性或配置项统一管理,避免多处散落:getComputedStyle(container).getPropertyValue('--breakpoint-sm') - 宽度计算用
container.clientWidth,不是offsetWidth(含边框)或scrollWidth(含溢出) - 首次执行要主动触发一次,否则初始化时宽度已小于阈值也不会隐藏列
动态合并单元格只能在 done 回调里操作 DOM,不能靠配置
Layui 的 cols 配置不支持 rowspan/colspan,所有合并都是渲染后手动设置 <td> 的属性。试图在 <code>cols 里加 cellMinWidth 或 align 完全无效。
- 必须选对 DOM:真实数据表格在
.layui-table-box .layui-table-body tbody,不是#demo直接查到的 table - 合并逻辑核心是「连续相同」:遍历
tr时,只对值与上一行相同的字段累加rowspan,遇到不同就重置计数,否则跨分组错位 - 开启分页时,每次翻页都触发
done,合并函数必须幂等(比如先清除旧rowspan再重算) - 如果表格有
height或启用虚拟滚动,tbody只渲染可视区域行,合并会漏掉——此时要么关 height,要么手动请求全量数据再合并
隐藏列 + 合并单元格共存时,DOM 选择器容易失效
当某列被 hide: true 后,对应 td[data-field="xxx"] 在 DOM 中根本不存在,但合并脚本若还按原始列索引找第 2 列,就会错位到下一列。
- 合并前先确认目标列是否可见:用
tableIns.config.cols[0].find(col => col.field === 'deptName')?.hide !== true - 列索引(
colIndex)必须基于当前实际渲染的列顺序重新计算,不能依赖原始配置里的位置 - 导出文件不受
hide影响,默认导出全部字段;如需同步视图,得手动过滤table.cache[tableIns.config.id]或重请求带字段筛选的接口 - 移动端隐藏列后,
min-width常残留导致横向滚动条异常,可加 CSS 强制收缩:.layui-table-box { min-width: 0 !important; }
done 里先判断哪些列该显示,再据此修正合并的目标列索引,最后操作 DOM。这个链条里任意一环断掉,不是列不见了,就是合并错行了。











