layui分页默认只认count和data两个顶层字段,后端其他字段(如code、msg、result.total)需在parsedata中手动提取并返回标准结构,该函数是获取完整响应体的唯一入口。

layui 分页默认只认 count 和 data 两个顶层字段,后端返回的其他字段(比如 code、msg、timestamp 或嵌套的 result.total)不会自动透传到前端逻辑里——你得手动从响应体中捞出来。
parseData 回调是唯一能拿到完整响应的地方
layui 在请求成功后,会把原始响应对象(即整个 JSON body)传给 parseData 函数。这是你接触完整响应体的**唯一入口**,所有字段都从这里解构。
- 必须显式配置
parseData,否则响应体直接被丢弃,只留下默认提取的count和data -
parseData的参数res就是后端返回的整个对象,比如{ code: 0, msg: "ok", result: { total: 123, list: [...] } } - 函数必须 return 一个对象,且至少包含
count和data字段,否则分页会报错 - 你可以顺手把其他字段挂到全局变量或闭包里,比如
window.lastResponseCode = res.code
如何安全读取非标准字段(如 code/msg)
别在 done 回调里硬写 res.code——如果没配 parseData,done 的 res 参数其实是被处理过的简化版,只保留了 count 和 data。
- 在
parseData里提前存好你需要的字段:localStorage.setItem('lastMsg', res.msg)或self.lastCode = res.code - 用可选链避免报错:
code: res?.code ?? -1(Layui 2.8+ 支持);老版本写code: res && res.code !== undefined ? res.code : -1 - 如果要根据
code做统一错误拦截,建议在parseData开头加判断:if (res.code !== 0) { layer.msg(res.msg || '请求失败'); return { count: 0, data: [] }; }
done 回调里的 res 不等于原始响应体
很多人误以为 done: function(res, curr, count) 中的 res 是后端原样返回的数据,其实不是:它已经被 parseData 处理过,只保留了你 return 出来的字段。想验证?在 parseData 里 return { count: 10, data: [], extra: 'hello' },然后看 done 里的 res 是否有 extra ——没有,因为 layui 内部做了白名单过滤。
-
done的res是「parseData 输出结果」,不是「网络响应体」 - 真正完整的响应体只存在于
parseData的入参中,错过就没了 - 如果你需要在多个地方用到
msg或timestamp,必须在parseData里一次性提取并缓存,别指望后续回调还能拿到
最常被忽略的一点:parseData 是单次执行的,它不随 reload 或 page 切换重复触发——除非你每次 reload 都传新的 parseData 函数。所以缓存逻辑要写在函数体内,而不是外层作用域里依赖闭包,否则可能拿到旧值。











