本文主要介绍 react-virtualized
, 使用版本9.21.0
前端开发会遇到一种棘手的情况: 渲染大量数据。首先, 这种情况要分析是否可以避免, 大致有如下的方式:
服务端分页
减少一次返回的数据,前端可以使用列表或者表格的形式展现, 表格展示一般使用分页, 列表的话, 监听 onscroll 事件, 当快触底时, 加载更多数据
前端假分页
获取的数据也许是第三方的数据,没有提供切片相关的接口, 只能前端分页。适用方式和服务端很类似,表格和列表均可适用(列表使用有点会有点奇怪)
图表渲染
svg 图表转换成 canvas
数据聚合, zoom in/out。例如地图应用
windowing
是 react 官方推荐的方法解决大数据渲染的办法,react-window
是react-virtualized
的阉割版,作者都是同一人
在使用 react-virtualized 之前,必须确认你是否真的需要它, 如果有可替换的方案, 我都建议优先使用替换方案。因为, 往往有更好的办法实现同样的需求, 它是最后的核武器了。
windowing
技术的核心就是 只渲染可视部分的内容
npm install react-virtualized --save
List
Api 介绍import { List } from "react-virtualized";
const data = [1,2,3,4,5];
<List
// 窗口的高度,必填
height={400}
// 窗口的宽度,必填
width={300}
// 总共个数
rowCount={data.length}
// cell高度
rowHeight={30}
style={{ outline: "none" }}
rowRenderer={({ key, index, isScrolling, style }) => {
if(isScrolling){ return <div key={ key } style={ style }>滚动中...</div> }
return <div key={ key } style={ style }>{ data[index] }</div>
}}
</List>
这是最简单的使用,其中height
,width
必填,指明窗口的大小,你也可以使用AutoSizer
实现动态宽高,查看这个例子,
rowCount
是总数, 这是必填的。
rowRenderer
是组件渲染, 其中 key
,style
字段必须设置给你的每一个 item, 你可以使用 data[index]
获取你的数据, isScrolling
表示当前是否正在滚动。
rowHeight
可以为固定数值或者一个函数返回一个数值, 结合 CellMeasurer
可以获取动态内容的高度
另外, 可以使用 ref
获取其 api, 调用scrollToPosition
可以平滑的滚动到指定的 index(搜索功能)
List
是Grid
的语法糖, 内部使用Grid
的 api 实现的。详见源码
记得第一次使用该库是 17 年,填了不少坑, 后面总结了经验, 然后到现在, 大概总共用到 4-5 次,相对来说使用频率很低。但是, 每次使用它开发完成后,成就感很高 😎。
另外, 掌握它, 还有一个很大的好处:
前端性能优化这个话题在面试属于一个加分问题,如果你能搬出react-virtualized
并讲讲使用,难道不比那种百度即可得的东西给人的印象更深刻??