Layui表格如何手动触发表格重绘

1次阅读

layui.table.reload() 是唯一可靠的手动重绘表格方式,它使已有实例按当前配置重新请求数据并渲染,避免事件丢失、分页错乱等问题,需传入原始 id,参数如 page、where、data 等影响重绘行为。

layui.table.reload() 是唯一可靠方式

手动重绘表格,不是刷新页面、也不是重新初始化实例,而是让已存在的 table 实例根据当前配置重新请求数据并渲染。layui 官方只提供 table.reload() 这个方法,其他诸如 table.render() 重复调用、或操作 dom 强制重绘,都会导致事件丢失、分页错乱、甚至报错 uncaught typeerror: cannot read property 'config' of undefined

常见错误现象包括:点击按钮后表格没变化、分页器卡在第一页、复选框状态错位、工具栏按钮点击失效。

  • 必须传入原始 id(即 render 时的 id 值),不能传错或漏写
  • 如果表格是异步加载(url 配置了接口),重绘会自动触发新请求;如果是静态数据(data 配置),需显式传入新 data
  • 不传任何参数调用 table.reload('demo') 会按原配置重载,适合仅刷新数据场景

reload() 中哪些参数会影响重绘行为

重绘不是“刷新视图”,而是重建表格逻辑链。传参不同,行为差异很大:

  • page:设为 {curr: 1} 会强制回到第一页;不传则保持当前页码
  • where:用于动态传参给后端,比如搜索条件变更后重绘,必须放在这里而不是拼在 url 字符串里
  • data:仅当原始表格用的是本地 data(非 url)才生效;传空数组或新数组会直接替换数据源
  • heightwidth:修改会导致表格容器重计算,可能触发滚动条闪动,慎用

示例:搜索后重绘并重置分页

table.reload('demo', {   where: { keyword: $('#keyword').val()},   page: {curr: 1} });

为什么 table.cache 不更新、reload 后还是旧数据

这不是 bug,是设计机制:Layui 表格的 cache 是只读缓存,由首次加载或每次 reload 后自动填充,不能手动修改。如果你在 reload 前改了 table.cache['demo'],reload 时会被新响应覆盖,白改。

真正需要“预处理数据”的场景,应该在 parseData 回调里做:

  • parseData 在接收到响应后、写入 cache 前执行,适合过滤、格式转换
  • 不要试图在 done 回调里改 cache,此时渲染已完成,改了也无用
  • 若后端返回结构不符合 Layui 要求(如根字段不是 datacount),必须用 response 配置映射字段,否则 reload 会解析失败

表格重绘后事件绑定失效怎么办

这是最常被忽略的点:Layui 的 on('tool(demo)', ……)on('checkbox(demo)', ……) 等事件监听,绑定在表格容器上,依赖事件委托。但 reload 后容器 DOM 被完全替换,旧监听器就丢了。

解决方法只有一个:所有事件监听必须放在 reload 之后,或统一收口到初始化函数里,确保每次 reload 完都重新绑定。

  • 不要把 table.on('tool(……) 写在 table.render() 外部且只执行一次
  • 推荐写法:封装一个 bindTableEvents() 函数,在 render 后和每次 reloaddone 回调里都调用它
  • 如果用了 elem: '#demo' 手动指定容器,reload 后记得确认该 DOM 是否还存在——某些模板框架(如 Vue)可能销毁并重建节点,导致 elem 失效

事情说清了就结束

text=ZqhQzanResources