table.resize()是首选方案,因其仅重算列宽和高度,保留页码、排序、选中状态等运行时上下文;而table.reload()会重载数据、重置分页,属过度操作。
必须手动监听容器变化并调用 table.resize(),table.reload() 仅适用于数据刷新或列结构变更,不是尺寸适配的正确选择。
为什么 table.resize() 是首选方案
表格容器(如侧边栏折叠、弹窗展开、Tab 切换)尺寸改变时,Layui 不会自动感知。此时只需重算列宽和高度,不涉及数据重载或状态重置。table.resize('id') 正是为此设计:它只触发内部 setColsWidth() 和高度重计算,保留当前页码、排序、选中状态、工具栏事件绑定等所有运行时上下文。
-
table.reload()会重新请求数据(若配置了url)、重置分页、清空缓存,纯属过度操作 -
layui.resize()是内部事件总线,table 模块默认不监听,调用无效 - 直接改
elem.style.width或 CSS 宽度,无法同步 fixed 列、表头/主体对齐、滚动条补偿等关键逻辑
window.onresize + table.resize() 的防抖写法
浏览器拖拽窗口边缘会高频触发 resize,不加节流会导致卡顿甚至渲染错乱。推荐用 setTimeout + clearTimeout 实现简单防抖,延迟 150ms 执行。
- 不要用
lodash.debounce或第三方库——Layui 环境下引入额外依赖易引发冲突 - 确保在
table.render()完成后再绑定,否则可能找不到实例 - 移动端需额外监听
orientationchange,因为横竖屏切换不触发resize
let resizeTimer;
$(window).on('resize', function() {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(function() {
table.resize('demo');
}, 150);
});
// 移动端兜底
window.addEventListener('orientationchange', function() {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(function() {
table.resize('demo');
}, 150);
});
table.resize() 对 height 的影响有限制
table.resize() 只对自适应高度生效:当 height 配置为 'full-xx'(如 'full-120')或未设置时,它会根据容器新高度重算表格区域;但若 height 是固定数值(如 height: 400),该方法不会改变表格高度。
- 固定高度表格在容器变高后,内容会被截断,且滚动条失效
- 若必须用固定高度,应改为
height: 'full-xxx'并动态计算差值(例如height: $(window).height() - 180) - 含
fixed: 'left'或fixed: 'right'的表格,resize 后左右固定列行高可能不同步,需在done回调里手动调用that.setFixedHeight()(Layui 2.8+ 内部方法,非公开 API,慎用)或重设fixedCellHeight
容器本身要支持尺寸变化
如果父容器用了 display: flex 但没设 flex: 1 或 min-width: 0,Layui 表格在 2.8+ 版本中可能渲染为 0 宽;如果父容器是 fieldset,其默认 min-inline-size: min-content 会压缩表格宽度,导致 table.resize() 计算出错。
- 给容器加
width: 100%、min-width: 0(对 flex 子项必要) - 遇到
fieldset,建议外层再包一层div并设width: 100%,避免直接嵌套 - 禁用
overflow: hidden在容器上,否则 resize 后横向滚动条可能被隐藏
真正容易被忽略的是:resize 触发时机必须在 DOM 布局稳定之后——比如在 layer 弹窗的 success 回调里调用 table.resize(),而不是 open 后立刻调用;否则容器还没完成渲染,offsetWidth 读出来是 0。











