最稳做法是用 hide: true 配合 resizeobserver 动态控制列显隐;必须传完整 cols 数组调用 setcols + reload,监听表格容器而非 window,且 hide 值须为布尔 true。
直接用 hide 配合 resizeobserver 动态控制列显隐,是最稳、最干净的做法。别信网上那些在 done 里用 jquery hide 元素的方案——闪一下再消失,体验差,且导出、排序、列宽计算全乱套。
初始化时必须用 hide: true 而不是 CSS 隐藏
想让列“真正消失”,就得让它不参与渲染。Layui 从 2.4 开始支持 hide: true 字段配置,这是唯一能保证列从 DOM、宽度计算、导出逻辑中彻底剔除的方式。
-
hide: 'true'或hide: 1—— ❌ 不生效,必须是布尔值true - 漏写
field—— ⚠️ 后续无法通过setCols定位该列,改配置也白搭 - 只加
style: 'display:none'—— ❌ 表头还在,列宽占位还在,导出时仍会包含 - 示例正确写法:
{field: 'remark', title: '备注', hide: true}
动态切换列要用 setCols + reload,不能只改配置
setCols 只更新内部列定义,不触发重绘;漏掉 reload 就等于白操作。尤其在 ResizeObserver 回调里高频触发时,必须确保每次修改都配对执行。
- 必须传入完整
cols数组(不是单列对象),结构要和初始化一致,否则表头顺序错乱、列宽丢失 - 如果表格启用了分页或远程请求,
reload会重新拉数据——若不想重复请求,需提前缓存where或设page: false - 避免在
done回调里反复调用setCols+reload,容易导致 DOM 渲染冲突或数据错位 - 推荐做法:先
table.config.cols拿到当前配置,修改目标列的hide值,再setCols+reload
用 ResizeObserver 监听容器宽度,别监听 window
表格响应式隐藏的关键是“相对于表格容器的宽度”,不是整个视口。监听 window.resize 会导致误判(比如侧边栏展开、弹窗遮挡),而监听表格父容器更精准、更可控。
- 获取容器:
document.querySelector('#demo').parentElement,不是document.body - 判断阈值建议按实际列宽累加估算,例如:3 列核心列总宽约 600px,则
width 时隐藏非核心列 - 注意防抖:
ResizeObserver触发频繁,但列切换不需要毫秒级响应,加个setTimeout缓存一次执行即可 - 示例片段:
const ro = new ResizeObserver(() => { clearTimeout(timer); timer = setTimeout(() => { const w = container.clientWidth; const newCols = JSON.parse(JSON.stringify(tableIns.config.cols)); newCols[0].forEach(col => { if (['remark', 'operator'].includes(col.field)) { col.hide = w
真正难的不是写几行代码,而是列配置一旦动态改了,导出、排序、固定列、合计行这些功能是否还正常——它们全依赖 cols 的完整性。所以每次 setCols 前,务必确认所有字段(field、title、width、templet)都保留原样,只动 hide。否则 reload 后发现排序图标没了、合计行错位、导出 Excel 多了一列空字段,就只能回退排查。











