react-virtualized初体验

2,007 阅读1分钟

业务场景

一次性插入1000条dom,如何不卡顿?如电商列表,朋友圈等等...

懒加载

最常见的方案是使用懒加载,懒加载的形式有很多,如滑动加载,但假设对已加载但不在用户视图的dom做处理,只会造成dom树冗余堆积,对低版本的机型和浏览器不友好,很容易造成卡死现象。

优化

在此基础上,有一个好的思路是列表在用户在视图的部分即渲染,不在的部分则不渲染,节省性能。react的社区非常的丰富,对于长列表的优化提供了react-virtualized库,实现了可视化列表的渲染。

虚拟列表

对于react-virtualized官方提供的介绍是:React components for efficiently rendering large lists and tabular data,即对react组件能高效的渲染长列表和数据。由于react渲染的数据并不是全完整的,我们一般称这种优化为虚拟列表。

使用

node版本:14.0.0 脚手架:create-react-app 虚拟列表:react-virtualized

import React from 'react';
import {List} from 'react-virtualized';


const renderLen = 100;
let ListItem:String[] = [];
for(let i = 0;i < renderLen;i++) {
    ListItem.push(Math.random()+"aaa");
}

function rowRenderer({
 	// 这里可以理解成渲染的内容样式
    key, // Unique key within array of rows
    index, // Index of row within collection
    isScrolling, // The List is currently being scrolled
    isVisible, // This row is visible within the List (eg it is not an overscanned row)
    style, // Style object to be applied to row (to position it)
}){
    return (
        <div key={key} style={style}>
            {ListItem[index]}
        </div>
    );
}

function TrueList() {
    return (
        <List
            width={300} //容器的宽
            height={300} //容器的高
            rowCount={ListItem.length} // 列表长度
            rowHeight={20} // 渲染条数
            rowRenderer={rowRenderer} // 渲染函数渲染列表样式
        />
    )
};

export default TrueList;

完成效果

保证了业务需要的效果:规定了视图里的dom渲染,视图外的不渲染,渲染条数固定。 在这里插入图片描述