templet函数中无法获取完整接口响应,只能通过layui.table.cache[obj.config.id]读取当前页原始数据;因templet仅接收单行数据d和表格上下文obj,不包含res或分页元信息,且table.cache仅在done回调后写入。
在 templet 函数里拿不到原始接口返回的完整数据(比如 res 对象),只能通过 layui.table.cache 读取当前页已加载的原始数据块——这是唯一可靠路径。
为什么 templet 里没有 res 或原始响应?
templet 是逐行渲染时调用的函数,只传入单行数据 d 和表格上下文 obj,不携带整个接口响应。所谓“原始接口数据”,实际指服务端返回的 data 数组中属于当前页的那部分,Layui 已将其切片并存入 table.cache。
-
d是当前行数据对象(如{id: 1, name: '张三'}),字段来自res.data,但不含分页元信息或额外字段 -
obj.config.url只是接口地址字符串,不是响应体 -
this指向d,不是响应对象,this.res或this.data全是undefined
正确获取当前页原始数据的方法
必须等 done 回调执行后,table.cache[id] 才被写入。在 templet 中直接读取即可,无需额外绑定或延迟。
- 确保初始化时写了
id: 'userTable',否则table.cache['userTable']是undefined - 在
templet中用obj.config.id动态取 ID,避免硬编码:templet: function(d, obj) { const cache = layui.table.cache[obj.config.id] || []; console.log('当前页原始数据:', cache); return d.name; } - 如果需要整个响应对象(含
count、msg等),得在done里存到全局变量或obj.config上,templet本身无法访问
常见误用与坑点
很多人试图在 templet 里发请求、读 localStorage 或依赖 getData(),结果要么重复请求,要么拿到过滤后数据,要么为空。
-
table.getData('userTable')返回的是 DOM 可见行(含搜索/筛选后的结果),不是原始接口数据 -
layui.table.cache在服务端分页模式下,只存当前页响应的data数组,不是全量数据 - 若表格尚未完成首次加载(
done未触发),table.cache[id]就是undefined,需加守卫:const cache = layui.table.cache[obj.config.id] || []; - 不要在
templet里调用$.ajax或fetch——它会被每行调用一次,造成 N 次请求
真正要注意的,是 cache 的生命周期:它只在 done 后存在,且每次重载(table.reload())会覆盖。如果你要跨页保留原始响应结构,得自己在 done 里存一份副本。











