真正清空layui表格数据必须三步并行:调用table.clearcache清除缓存,reload时传where:{}重置查询条件并显式设置page:{curr:1},若为本地数据还需清空原始data变量。

直接调用 table.reload() 不会清除旧数据,只会重新请求或重载——真清空必须切断数据源、重置状态、强制重绘。
为什么 table.reload({ data: [] }) 看似清空实则无效
这是最常踩的坑:传 data: [] 后 tbody 空了,但页码仍显示“1 / 5”,点下一页立刻加载第二页原始数据。原因在于:
-
table.reload()默认仍会读取原始配置里的url或data字段,data: []只作用于当前页渲染,不覆盖源头 - 若启用了服务端分页(
page: true),data字段会被 layui 忽略,reload 完全不生效 - 分页器总条数(
count)、当前页码(curr)、合计行(totalRow)等都依赖内部缓存,不主动清理就一直残留
table.clearCache() 单独调用没用,必须配合 reload 或重 render
table.clearCache('tableId') 只清掉选中状态、跨页勾选标记、缓存的 allChecked 标志,它不更新 DOM,也不影响分页信息或合计行。所以:
- 不能只写
table.clearCache('userTable')就完事 - 必须紧接着执行
table.reload('userTable', { where: {}, page: { curr: 1 } }),其中where: {}是关键,确保下次请求不带搜索条件 - 如果表格是本地数据(靠
data: [...]初始化),还得提前把原始data变量设为空数组,否则 reload 时仍从原数组取值
最稳妥的清空方式:用相同配置 table.render() 重绘
尤其适合已存在实例、且要彻底断开旧状态的场景。核心是复用原配置,仅替换数据源并禁用远程请求:
- 保留
elem、cols、id、page等所有配置项,避免列宽/样式丢失 - 显式设置
data: []和url: null(不是'',null才能确保 layui 彻底忽略接口) - 若启用分页,必须加
page: { total: 0 },否则分页栏可能还显示“1 / 1” - 重 render 时
id必须和原实例一致,否则工具栏按钮事件绑定失效
table.render({
elem: '#demo',
id: 'demoTable',
cols: [[{ field: 'id', title: 'ID' }]],
data: [], // 关键:空数组
url: null, // 关键:禁用远程请求
page: { total: 0 }
});
清空后工具栏按钮点击报错或合计行残留怎么办
清空后点自定义按钮抛 Cannot read property 'data' of undefined,大概率是事件监听还绑在已被删的 <tr> 上;合计行没消失,是因为 <code>totalRow 不随 data: [] 自动隐藏:
- 全局委托事件(如
$(document).on('click', '.btn-del', ...))必须在清空前手动解绑:$('.btn-del').off('click') - 合计行残留可提前移除 DOM:
$(table.elem).next('.layui-table-total').remove(),再 reload - 搜索框(toolbar 区域 input)不会自动清空,需额外执行:
$('input[lay-key="search"]').val('').trigger('input')
真正清空的本质不是删 DOM,而是让 layui 用空数据走完一次完整渲染流程——漏掉 url: null、id 不一致、或没重置 page.total,都会导致“清空”只是视觉假象。











