跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Layui表格如何动态显示或隐藏某一列

layui.table.setColsVisible 不是官方API,根本不存在;正确做法是深拷贝 tableIns.config.cols 后修改目标列 hide 属性,再调用 reload 重绘表格。 layui.table.setColsVisible 为什么不起作用 因为
layui.table.setcolsvisible
根本不是 layui 官方提供的 api,它不存在。你搜到的所谓“方法”大多是社区拼凑的伪代码或旧版魔改方案,直接调用会报
typeerror: layui.table.setcolsvisible is not a function
。 真实可行的路径只有一条:操作表格实例的
config.cols
,再用
reload
重绘。但要注意——
cols
是二维数组(每行一个列配置),修改必须深拷贝后进行,否则会污染原始配置。 不要直接改
tableIns.config.cols[0][2]
这类引用值,要用
JSON.parse(JSON.stringify(...))
或结构化克隆(如支持
structuredClone
) 隐藏列本质是把对应列的
hide: true
写进去,Layui 会自动跳过渲染该列
reload
时传入的
cols
必须和初始化时结构完全一致(包括嵌套层级、字段顺序),否则表头错位或数据列错乱 如何安全地动态切换某列的显示/隐藏状态 核心逻辑是:拿到当前列索引 → 找到它在
config.cols
中的位置 → 深拷贝整个
cols
→ 修改目标列的
hide
值 → 调用
tableIns.reload({ cols: newCols })
。 示例场景:点击按钮隐藏“操作”列(假设它在第一组列中第 4 个位置):
let cols = JSON.parse(JSON.stringify(tableIns.config.cols)); cols[0][3].hide = true; // 注意:索引从 0 开始,第 4 个是 [3] tableIns.reload({ cols: cols });
如果列被设为
fixed: 'left'
或
fixed: 'right'
,它的
hide
属性依然生效,但固定列区域宽度不会自动收缩,需手动调用
table.resize()
若表格启用了
autoSort: true
,
reload
后排序状态会丢失,需要额外保存并还原
initSort
使用
cols
重载时,
where
、
page
等参数不会继承,要显式传入,否则可能回到第 1 页或丢掉搜索条件 用 data-field 匹配列比靠索引更可靠 硬写
cols[0][3]
极易出错——加删列、响应式折叠、多级表头都会让索引偏移。正确做法是遍历
config.cols
,按
field
或自定义
data-field
属性定位目标列。 初始化表格时给关键列加标识:
{field: 'op', title: '操作', width: 120, data-field: 'operation'}
之后切换显示状态:
function toggleCol(tableIns, fieldKey) { let cols = JSON.parse(JSON.stringify(tableIns.config.cols)); const walk = (arr) => { for (let i = 0; i < arr.length; i++) { if (arr[i].field === fieldKey || arr[i]['data-field'] === fieldKey) { arr[i].hide = !arr[i].hide; return true; } if (arr[i].children && walk(arr[i].children)) return true; } }; walk(cols); tableIns.reload({ cols }); } toggleCol(tableIns, 'operation');
data-field
是自定义属性,Layui 不处理,但方便你在 JS 中识别列意图,比仅靠
field
更灵活(比如多个列共用同一
field
时) 必须递归遍历
children
,否则带分组表头的列找不到 别忘了在 HTML 按钮上绑定
data-field
,和 JS 里保持一致,避免硬编码字符串散落各处 隐藏列后导出 Excel 仍包含该列? 是的。
hide: true
只影响前端渲染,不影响
exportFile
的数据源。导出时默认用原始数据(
data
或
url
返回的完整字段),不会自动过滤掉被隐藏的列。 解决办法只有两个: 导出前手动过滤数据:用
table.cache['yourId']
拿到当前页缓存数据,再根据
config.cols
中
hide: true
的列名做
map
投影 服务端导出:把要隐藏的列名传给后端,由后端控制字段输出,更干净也更可控 如果用的是
exportFile
的简易模式(没配
data
),它会重新请求接口,此时需后端配合识别
export=1
类似参数,返回精简字段 最常被忽略的一点:列隐藏状态是客户端行为,刷新页面就重置。如果业务要求“用户下次进来还保持上次隐藏的列”,得自己把
hide
状态存到
localStorage
,并在
init
时注入
cols
配置里。

相关文章