必须关掉分页(page: false)或传入全量data数组,否则table.getAllData()返回空数组;因服务端分页下Layui仅缓存当前页数据,全量数据需通过data字段传入或额外请求获取。

必须关掉分页(page: false),或手动传入全量 data 数组,否则 Layui 不会把所有数据加载进内存 —— 这不是配置问题,是设计限制。
为什么 table.getAllData() 返回空数组
这个函数只读取当前已加载进 JS 内存的数据。当开启分页(page: true)且用的是服务端分页(url 配置)时,Layui 默认只请求并缓存当前页数据,其他页的数据根本没进浏览器。所以 table.getAllData() 拿不到全量,返回空数组是正常行为。
- 只有两种情况它能返回全部数据:① 初始化时传了本地全量
data: [...]且page: false;② 后端一次性返回全部数据、前端用parseData做前端分页(此时data在配置里是完整的) - 别指望
table.cache['id']能跨页拿数据 —— 它只存当前页渲染行的快照,翻页后就被覆盖 - 如果你看到它偶尔有数据,大概率是误用了前端分页模式,而非服务端分页
前端分页模式下获取全量数据的正确方式
前提是:你让后端一次性返回全部数据,并在 table.render() 中用 data 字段传入(而不是 url),同时设 page: true 让 Layui 做前端分页渲染。
- 全量数据始终存在:
layui.table.getOptions('tableId').data—— 这个data是初始化时传入的原始数组引用,编辑、新增、删除都会实时更新它 - 注意:这个方法不适用于服务端分页(即用了
url);服务端分页下,getOptions().data是undefined或空数组 - 如果用了
parseData,确保你在里面返回的res.data是全量数组,而不是切片后的结果 —— 切片逻辑应由 Layui 内部根据limit和curr自动处理
服务端分页想“假装”一次性加载?别硬来
服务端分页本质是按需拉取,浏览器本地没有全量数据。所谓“一次性加载所有数据”,只能靠额外一次全量接口请求,自己存到变量里,再手动绑定到表格或用于搜索/导出等操作。
- 例如:先发一个
/api/data?all=true拿全量,存到window.fullTableData = res.data;后续搜索、导出都基于它,但表格渲染仍走url分页流程 - 不能直接把全量塞进
table.cache并期望getAllData()生效 —— Layui 不允许外部写入cache,强行改会导致渲染错乱或事件失效 - 全选所有页、跨页搜索这类需求,在服务端分页下,必须配合后端批量接口,前端只传 ID 列表,而不是扛全量数据
最易被忽略的一点:很多人以为开了 page: true 就能自动管理全量,其实关键在数据来源 —— data 字段是否承载了全部,决定了你能操作的边界。一旦用了 url,就等于把数据主权交给了后端,前端只剩当前页的“视图”。


















