最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Layui表格如何实现根据不同的用户角色动态删除某几列
时间:2026-07-24 10:46:59 编辑:袖梨 来源:一聚教程网
应于table.render()前按角色动态生成cols数组,通过拼接基础列与权限列实现过滤,避免操作DOM或CSS隐藏;reload时需重新调用列生成函数并传入cols参数。
layui table 列配置怎么根据角色动态过滤
直接改 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'列,确保它始终在拼接后数组末尾,否则固定列会错位 - 导出 Excel 时,
cols过滤对exportData有效,但若用了done回调手动处理数据,得同步检查列可见性
为什么不能用 CSS 隐藏列(display: none)
表面看 .layui-table-box .layui-table tbody tr td:nth-child(3) 加 display: none 能“隐藏”,但实际埋了三个坑:
- 列宽计算失效:Layui 会把隐藏列的宽度计入总宽,导致其他列被压缩或换行
- 排序图标仍存在:点击隐藏列的表头,
sort事件照常触发,但 UI 没反馈,用户以为没反应 - 响应式断点错乱:小屏下自动折叠为「更多」弹窗时,隐藏列可能意外出现在弹窗里,或让弹窗布局崩坏
真要临时隐藏(比如搜索筛选),用 table.hideCol('field') 和 table.showCol('field') ——这是 Layui 2.8+ 提供的官方 API,它会同步更新内部列状态,不影响后续功能。
遇到 table.reload() 后列又回来了怎么办
因为 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 参数补全。
相关文章
- 苹果折叠屏爆料汇总:售价超两万,比例阔折叠 07-30
- 纪念碑谷3 纪念碑谷3手游玩法详解与体验评测 07-30
- 晴空双子金卡阵容推荐 晴空双子高性价比氪金养成指南 07-30
- 大周列国志全新派系系统 07-30
- 兔小萌世界甜系小房间搭建指南 兔小萌世界高颜值甜系房间布置全流程详解 07-30
- 大周列国志全新剧本包西汉剧本包 07-30