2.4 2.13:element 模块拆分与五大组件重构
2025-10-24 的 2.13.0,动的是 layui 里资历最老的模块之一:element。同时五大组件集体重构,lay 工具方法补上了树形数据处理的老缺口。这一篇把 2.13 看透。
element 拆分:从大杂烩到职责单一
element 在老版本里的角色很微妙:tab、导航、面包屑、进度条、折叠面板全塞在一个模块里,堪称组件界的大杂烩。当年这样打包有历史原因——快速搭建页面时一次引入全部就位,确实省事。但代价也显而易见:模块职责模糊,按需加载不彻底,维护上牵一发而动全身。
2.13.0 把 element 拆分为 tab、nav、breadcrumb、progress、collapse 五个组件模块。这一步是架构意义上的拨乱反正:每个模块只管自己的事,按需引入变得名副其实,组件的演进节奏也不再被同一个模块绑架。
老用户最关心的问题当然是:老代码会不会炸?答案是基本不会。官方明确原接口保留兼容,你原来怎么用 element,现在还可以怎么用,业务不受影响。唯一的例外是 element 内的 tab 功能,它已经被 2.10 的全新 tabs 正式平替,新项目理应直接用 tabs。所以这次拆分对存量项目是平滑过渡,对新技术选型则是清晰的路标。
element 拆分映射表
把老模块的能力与新组件模块一一对应,迁移时就有了地图:
| 老 element 内的能力 | 拆分后的归属 | 迁移建议 |
|---|---|---|
| tab 标签页 | 已由全新 tabs 平替 | 直接迁移到 tabs,不再留恋 |
| nav 导航菜单 | nav 组件模块 | 新代码用 nav,老用法仍兼容 |
| breadcrumb 面包屑 | breadcrumb 组件模块 | 同上 |
| progress 进度条 | progress 组件模块 | 同上 |
| collapse 折叠面板 | collapse 组件模块 | 同上 |
拆分之后,原接口保留兼容是过渡期的保护伞,但我的建议依旧是:新代码按新模块写,老代码在迭代窗口里逐步换血,把兼容层当作缓冲垫而非永久依赖。兼容层存在的意义是让迁移可以按节奏进行,而不是让人永远不用迁移。
五大重构组件:各自补强的一步
2.13.0 同时重构了 carousel、colorpicker、flow、transfer、tree 五个组件。它们的升级方向,我逐个用一句话概括,具体细节以官方更新日志为准:
| 组件 | 用途 | 重构方向一句话 |
|---|---|---|
| carousel | 轮播 | 老牌轮播在新范式下焕新,基础体验补齐 |
| colorpicker | 颜色选择器 | 选色交互与稳定性的一次整体翻修 |
| flow | 流加载 | 滚动加载这一经典能力的基础夯实 |
| transfer | 穿梭框 | 双栏穿梭场景的结构与体验重构 |
| tree | 树 | 树组件结构性重构,为复杂树场景打底 |
值得一提的是,这五大重构与此前 rate、slider 用 component 重构一脉相承:组件范式统一化不是一次性运动,而是按批次推进的长期工程。2.13 这一批完成后,layui 老组件里最需要翻修的几座大山基本翻完,剩下的存量组件按这个节奏推进只是时间问题。
lay 新增 treeToFlat 与 flatToTree:树形数据的互转利器
2.13.0 还在 lay 工具方法里新增了 treeToFlat 与 flatToTree,前者把树形结构压平成扁平数组,后者把扁平数组组装成树形结构,lay.extend 的实现也一并做了重构增强。
这两个方法的实用场景,做过中后台的都懂。后端接口最常见的返回是带父节点标识的扁平列表,而 tree 这类组件要的是嵌套树形结构,于是几乎每个项目里都长着一份自己手写的递归转换函数:风格各异、边界处理参差、换个项目又得重写一遍。现在官方直接给了标准答案:
- flatToTree:接口返回扁平列表,一转即得树组件可用的结构,再也不用手写递归。
- treeToFlat:反向场景同样顺手,编辑树之后压平提交给后端,数据往返天然对称。
- 双向都有官方实现,意味着前后端的数据契约可以放心按扁平结构设计,展示层转换交给 lay。
数据转换看似小事,但它是树类需求里重复劳动最多的一环。官方收编之后,这类代码从业务仓库里消失了,这是一件值得高兴的事。
小结
2.13.0 的主题词是拆与立:拆掉 element 大杂烩,立起五个职责单一的组件模块;重构五大老组件,立稳统一组件范式的又一批成果;再配上树扁平滑互转这样的实用工具,这一版为后续迭代腾出的空间相当可观。至此,2.10 以来的高频迭代形成了完整闭环。
