应于table.render()前按角色动态生成cols数组,通过拼接基础列与权限列实现过滤,避免操作DOM或CSS隐藏;reload时需重新调用列生成函数并传入cols参数。
直接改 cols 数组,别动渲染后的 dom。layui 表格的列定义是初始化时传入的纯配置,后续想隐藏/删除列,最稳的方式是在生成 cols 前就按角色筛掉对应字段。
常见错误是等表格渲染完再用 jQuery 隐藏 .layui-table-cell 或删 <th>,这会导致排序、导出、固定列等功能异常,且响应式折叠逻辑错乱。
table.render() 之前完成,比如从后端接口取用户权限,或读取全局 userRole 变量cols 是二维数组,每层代表一个表头层级;通常只有一层,删列就是从该层子数组里 filter 掉不需要的列对象field 或自定义 key 字段做角色匹配,别依赖 title(中文标题可能被翻译或修改)“操作”列常含编辑/删除按钮,不同角色权限不同;敏感字段如 salary、idCard 更不能硬编码在所有角色的配置里。
正确做法是把列定义拆成基础列 + 权限列,再拼接:
const baseCols = [{field: 'name', title: '姓名'}, {field: 'dept', title: '部门'}];const adminCols = [{field: 'salary', title: '薪资', templet: '{{d.salary}}'}];const editorCols = [{field: 'operate', title: '操作', toolbar: '#operateTpl'}];let cols = [baseCols];if (userRole === 'admin') { cols[0] = cols[0].concat(adminCols);}if (['admin', 'editor'].includes(userRole)) { cols[0] = cols[0].concat(editorCols);}
注意:toolbar 模板也要按角色加载,否则即使列被过滤,模板仍可能被解析报错。
delete 或 splice 原地修改已传入 table.render() 的 cols 引用——Layui 不监听数组变更fixed: 'right' 列,确保它始终在拼接后数组末尾,否则固定列会错位cols 过滤对 exportData 有效,但若用了 done 回调手动处理数据,得同步检查列可见性表面看 .layui-table-box .layui-table tbody tr td:nth-child(3) 加 display: none 能“隐藏”,但实际埋了三个坑:
sort 事件照常触发,但 UI 没反馈,用户以为没反应真要临时隐藏(比如搜索筛选),用 table.hideCol('field') 和 table.showCol('field') ——这是 Layui 2.8+ 提供的官方 API,它会同步更新内部列状态,不影响后续功能。
因为 reload() 默认复用初始 cols,不会重新执行你之前的过滤逻辑。
解决方法只有两个:要么在 reload 时显式传入新 cols,要么把列过滤逻辑封装成函数,每次 reload 都调用:
function getColsByRole() { const cols = [[{field: 'id', title: 'ID'}, {field: 'name', title: '姓名'}]]; if (userRole === 'admin') { cols[0].push({field: 'ip', title: '登录IP'}); } return cols;}// 初始化table.render({elem: '#demo', cols: getColsByRole(), ...});// 重载时table.reload('demo', {cols: getColsByRole()});
容易被忽略的是:如果用了 page: true,reload 会丢失当前页码和排序状态,需手动传 where 和 initSort 参数补全。