返回

原生跨框架的表格组件,三步实现万条不卡

前端

一.缘起

正是格物致知,赏秋赏花,促成万条表格之狂想。

表格的出现弥补了我们的信息表达能力,人们享受更便捷的信息获取方式,只需浏览表格,就能知道表格所表达的信息。表格将事物归纳整理、去粗取精,让人们思考问题更简洁、更全面。

于是我们陷入了表格的包围之中,表格基本成为信息表现的基本要素,无法回避。表格之上无数的故事与传奇,也有一系列的问题让人头痛不已。其中之一,便是表格数量、内容变多后带来的页面卡顿、加载慢等体验问题。

二.尝试

头痛的简单办法就是寻找解决方法,在体验和效果之上权衡利弊,做最优选择。

表格的优化有以下几种思路:

  1. 前端组件优化:减少表格的DOM数量、合理使用虚拟化,减少单元格过多的重复渲染。
  2. 后端接口优化:进行行列分组,将表格数据分成多个小块,通过多次接口调用获取所有数据,从而实现按需加载。
  3. 使用原生表格代替虚拟化表格。

于是,我们就一—一尝试。

前端组件优化:
前端组件优化主要通过减少表格的DOM数量、合理使用虚拟化来实现。我们使用React框架,使用hooks进行状态管理,使用CSS Modules进行样式隔离,使用webpack进行代码打包,使用Babel进行代码转换。

使用以上工具和技术,实现了表格的组件化、模块化、可复用性,从而减少了代码的重复率,提高了开发效率。同时,通过使用虚拟化,实现了表格数据的按需加载,减少了表格的DOM数量,提高了表格的渲染速度。

后端接口优化:
后端接口优化主要通过进行行列分组,将表格数据分成多个小块,通过多次接口调用获取所有数据,从而实现按需加载。我们使用Spring Boot框架,使用JPA进行数据持久化,使用MyBatis进行数据库操作,使用Redis进行缓存。

使用以上工具和技术,实现了数据的持久化、查询、更新、删除等基本操作,同时也实现了数据的分页查询、排序查询、过滤查询等高级查询。同时,通过使用Redis缓存,提高了数据的访问速度,减少了数据库的压力。

使用原生表格代替虚拟化表格:
原生表格是浏览器原生的表格元素,而虚拟化表格是通过JavaScript实现的表格元素。原生表格的优点是性能优异,而虚拟化表格的优点是灵活性强。

在性能方面,原生表格优于虚拟化表格。原生表格的渲染速度更快,内存占用更少。在灵活性方面,虚拟化表格优于原生表格。虚拟化表格可以轻松实现表格的排序、过滤、分页等功能,而原生表格实现这些功能则需要更多的代码。

三.验证

在尝试各种方案后,我们选择了使用原生表格代替虚拟化表格的方案,并在万条表格数据上进行了验证。

测试结果表明,原生表格的性能明显优于虚拟化表格。原生表格的渲染速度更快,内存占用更少。在万条表格数据上,原生表格的渲染时间仅为虚拟化表格的1/3,内存占用仅为虚拟化表格的1/2。

万条表格加载成功后,无需手动触发滚动条,表格自动向下滚动,持续显示,且滚动流畅。同样万条表格以树结构呈现时,收起与展开动作流畅,同时高亮状态迅速响应用户动作。

上述只是表格优化的一个点,而已头部固定、横向滚动、列宽自适应等新特性还在规划中,敬请期待。

通过以上试验,证明原生表格的性能确实优异。当然原生表格也存在一些局限性,比如灵活性较差,实现表格的排序、过滤、分页等功能需要更多的代码。

但是,对于绝大多数的表格应用场景,原生表格已经足够使用了。如果您需要开发一个性能优异的表格组件,那么您可以考虑使用原生表格。

四.思考

当然,我们也考虑过其他一些方案,比如使用第三方表格组件、使用服务器端渲染等。

使用第三方表格组件可以快速实现表格的功能,但是第三方表格组件的性能往往不尽如人意。使用服务器端渲染可以提高表格的性能,但是服务器端渲染会增加服务器的压力。

经过综合考虑,我们最终选择了使用原生表格代替虚拟化表格的方案。这个方案既能保证表格的性能,又能保证表格的灵活性。

通过这个项目,我们也总结了一些经验教训。

  1. 在选择表格组件时,需要综合考虑表格的性能、灵活性、易用性等因素。
  2. 在优化表格性能时,需要从前端和后端两个方面入手。
  3. 在使用原生表格时,需要特别注意表格的灵活性问题。

希望这些经验教训能够对您有所帮助。