Layui表格如何处理后端返回的带层级的List集合数据

夜宇小哥_4171

夜宇小哥_4171

2026-04-20

480人浏览

原创

layui.table.render 不支持自动解析嵌套字段,必须在 parseData 中将多层嵌套数据扁平化为一级对象数组,或使用 templet 手动取值并做空值防护。

layui.table.render 怎么解析后端返回的嵌套 List 数据

直接说结论:layui 的 table.render 本身不支持自动展开多层嵌套结构,必须在 parsedata 回调里手动扁平化或映射字段。

后端返回类似 [{ "id":1, "user":{"name":"张三","dept":{"title":"研发部"}} }] 这种结构时,表格列定义里写 field: 'user.name' 是无效的 —— layui 不做路径解析,只认一级 key。

  • 必须用 parseData 把原始响应数据转成每行都是一级对象的数组
  • 或者在列定义中用 templet 手动取值:templet: '<div>{{d.user?.name}}</div>'(注意加可选链,避免报错)
  • 如果嵌套层级深、字段多,推荐前者:统一在 parseData 里处理,避免模板里重复写 d.a?.b?.c?.d

parseData 里怎么安全提取嵌套字段并兼容空值

后端返回的嵌套对象可能为 null 或缺失,直接访问 d.user.name 会触发 JS 错误,导致表格渲染中断。

正确做法是在 parseData 中对每条数据做防御性处理,用逻辑运算符或空值合并操作符兜底:

深蓝色网站后台管理系统layui框架模板-AdminPro
深蓝色网站后台管理系统layui框架模板-AdminPro

一款深蓝色网站后台管理系统layui框架模板

下载
parseData: function(res){
  return {
    "code": res.code,
    "msg": res.msg,
    "count": res.count,
    "data": res.data.map(function(item){
      return {
        id: item.id,
        userName: item.user && item.user.name || '-',
        deptTitle: (item.user?.dept || {}).title || '-',
        // 更稳妥写法(兼容 IE):
        // deptTitle: item.user && item.user.dept && item.user.dept.title || '-'
      };
    })
  };
}
  • 别依赖可选链(?.)在低版本浏览器中运行,生产环境建议用 && 显式判断
  • 所有嵌套字段都要设默认值(如 '-'),否则空值会导致列内容空白,用户以为数据丢了
  • 如果后端返回的是数组嵌套(如 tags: [{name:"前端"},{name:"Vue"}]),需提前拼成字符串再塞进字段,例如 tagsText: (item.tags || []).map(t => t.name).join(' / ') || '-'

为什么不能直接在 cols 里写 field: 'user.name'?

因为 layui 表格的 field 只用于生成 data-field 属性和内部索引键,并不参与取值逻辑;真实取值发生在模板渲染阶段,而默认模板只执行 d[field],即严格的一级属性访问。

  • 写 field: 'user.name' 后,实际执行的是 d['user.name'],不是 d.user.name
  • 除非你同时配了 templet,否则这个 field 值毫无意义,列会显示空
  • 如果想保留原字段名又省事,可以在 parseData 里把嵌套字段“拍平”,比如把 user.name 拷贝成 userName,后续列定义就干净了

后端返回 List> 怎么展开展示成单层表格

比如订单列表里每个订单带多个商品(orderItems: [{name:"iPhone", qty:2}, {name:"AirPods", qty:1}]),要展示成「订单ID|商品名|数量」这样的明细表,不是聚合行。

  • 不能靠前端模板循环实现 —— layui 表格每行对应一个数据项,不支持子行嵌套
  • 必须由后端返回已展开的数据,或前端在 parseData 里用 flatMap 处理:res.data.flatMap(order => (order.orderItems || []).map(item => ({...order, itemName: item.name, qty: item.qty})))
  • 注意分页逻辑:如果后端按订单分页,但你要展示商品明细,那总条数、当前页数据都需要重算,count 和 data 都得在 parseData 里重新组织
  • 这种场景下,服务端分页基本失效,建议改用前端分页(page: false),或让后端提供专门的明细接口

嵌套数据的处理核心就一条:layui 表格只吃“扁平数组”,所有结构转换必须发生在进表格之前。谁负责扁平化,取决于性能要求和后端配合程度 —— 但无论如何,不能指望 field 自动解析点号路径。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

layui

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2463

5

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6370

13

后端的主要工作内容介绍
后端的主要工作内容介绍

后端是应用程序的服务端部分,负责核心任务,如数据库交互、业务逻辑处理和响应客户端请求。想了解更多后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5746

10

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2463

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5323

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6370

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5958

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

843

5

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2023.08.07

2095

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
LLVM官方文档
LLVM官方文档

共0课时 | 0人学习