react-virtualized实现行元素不等高的虚拟列表滚动

news2024/10/7 4:29:24

前言:

        当一个页面中需要接受接口返回的全部数据进行页面渲染时间,如果数据量比较庞大,前端在渲染dom的过程中需要花费时间,造成页面经常出现卡顿现象。

        需求:通过虚拟加载,优化页面渲染速度

        优点:不需要固定行元素高度一致

行元素等高的虚拟列表实现方法
实现方法

npm 安装 react-virtualized

npm install react-virtualized --save

页面引入

import { List as VirtualizedList, AutoSizer, CellMeasurer, CellMeasurerCache } from 'react-virtualized';

Cp.jsx

import React, { Component } from 'react';
import { List as VirtualizedList, AutoSizer, CellMeasurer, CellMeasurerCache } from 'react-virtualized';

class Cp extends Component {
  constructor(props) {
    super(props);
    this.cache = new CellMeasurerCache({
      fixedWidth: true, 
      defaultHeight: 100 // 未计算的单元格初始默认的高度
    });

    this.state = {
      viewWidth: 200,
      viewHeight: 500,
      dataList: [
        {id: 1, content1: '小灰灰学编程小灰灰学编程小灰灰学编程', content2: '小灰灰学编程小灰灰学编程小灰灰学编程小灰灰学编程'},
        {id: 2, content1: '小灰灰学编程', content2: '小灰灰学编程小灰灰学编程小灰灰学编程小灰灰学编程'},
        {id: 3, content1: '小灰灰学编程小灰灰学编程', content2: ''},
        {id: 4, content1: '小灰灰学编程小灰灰学编程小灰灰学编程小灰灰学编程', content2: '小灰灰学编程'},
        {id: 5, content1: '小灰灰学编程', content2: ''},
        {id: 6, content1: '小灰灰学编程小灰灰学编程', content2: '小灰灰学编程'},
        {id: 7, content1: '小灰灰学编程小灰灰学编程小灰灰学编程', content2: '小灰灰学编程'},
        {id: 8, content1: '小灰灰学编程小灰灰学编程小灰灰学编程小灰灰学编程小灰灰学编程小灰灰学编程小灰灰学编程', content2: '小灰灰学编程小灰灰学编程小灰灰学编程小灰灰学编程小灰灰学编程小灰灰学编程'},
        {id: 9, content1: '小灰灰学编程小灰灰学编程', content2: ''},
        {id: 10, content1: '小灰灰学编程', content2: '小灰灰学编程'},
        {id: 7, content1: '小灰灰学编程', content2: '小灰灰学编程小小灰灰学编程小灰灰学编程小灰灰学编程灰小灰灰学编程灰学编程'},
        {id: 8, content1: '小灰灰学编程', content2: '小灰灰学编程小小灰灰学编程灰灰学编程'},
        {id: 9, content1: '小灰灰学编程小灰灰学编程', content2: ''},
        {id: 10, content1: '小灰灰学编程', content2: '小灰灰学编程'},
      ]
    }
  }

  componentDidUpdate() {
    // 重置所有单元格的计算缓存
    this.cache.clearAll();
  }

  /**
   * rowRenderer 渲染行元素的方法
   *    index: 索引
   *    key: 记录在数组中的位置
   *    parent: 定义该列表是另一个列表的父列表还是子列表
   *    style: 用于定位行的样式对象
   *    isVisible: 确定行是否可见或不可见
   *    isScrolling: 指示组件中是否发生滚动 List
   * 
   * CellMeasurer 自动计算单元格内容的高阶组件
   *    cache: 在CellMeasure和他们父级的Grid之间共享的缓存
   *    children: 子元素 可以是一个react元素或者函数
   *    columnIndex: 经计算的列index | 0
   *    parent: 父级Grid的引用
   *    rowIndex: 经计算的行index
   */

  rowRenderer = ({ index, key, parent, style }) =>{
    const {dataList} = this.state
    const itemData = dataList[index];
    return (
      <div key={key} style={style}>
        <CellMeasurer
          cache={this.cache}
          columnIndex={0}
          key={key}
          rowIndex={index}
          parent={parent}
        >
          <div>
            <div>{`第${itemData.id}个元素`}</div>
            <div>content1: {itemData.content1}</div>
            <div>{itemData.content2}</div>
          </div>
        </CellMeasurer>
      </div>
    );
  }

  render() {
    const {dataList} = this.state
    return (
      <div className="virtualized-list">
        <AutoSizer>
          {({ viewWidth, viewHeight }) => (
            /**
             * VirtualizedList
             *    width: 可视区域宽度
             *    height: 可视区域高度
             *    rowHeight: 行高度
             *    rowCount: 列表长度
             *    dataList: 列表数据
             *    rowRenderer: 渲染行元素的方法
             *    overscanRowCount: 用于沿用户滚动的方向呈现附加行
             *    deferredMeasurementCache: 用于临时呈现数据,缓存计算数据
             */
            <VirtualizedList
              width={this.state.viewWidth}
              height={this.state.viewHeight}
              rowHeight={this.cache.rowHeight}
              rowCount={dataList.length}
              rowRenderer={this.rowRenderer}
              deferredMeasurementCache={this.cache}
              dataList={dataList}
              overscanRowCount={1}
            />
          )} 
        </AutoSizer>
      </div>
    );
  }
}

export default Cp;

 效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1426355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索组合模式的魅力:探索树形结构的艺术与科学

设计模式专栏&#xff1a;http://t.csdnimg.cn/nolNS 在面对层次结构和树状数据结构的软件设计任务时&#xff0c;我们如何优雅地处理单个对象与组合对象的一致性问题&#xff1f;组合模式&#xff08;Composite Pattern&#xff09;为此提供了一种简洁高效的解决方案。通过本…

网络协议 UDP协议

网络协议 UDP协议 在之前的文章中有对UDP协议套接字的使用进行讲解&#xff0c;本文主要对UDP协议进行一些理论补充。 文章目录 网络协议 UDP协议1. 概念2. UDP协议格式2.1 数据报长度2.2 校验和/检验和2.2.1 CRC校验2.2.2 MD5算法 1. 概念 UDP&#xff0c;即User Datagram P…

[office] excel2010双向条形图制作 #经验分享#微信

excel2010双向条形图制作 本教程为大家介绍一下excel2010中excel2010双向条形图制作方法。 1.选中工作区域 2.点击插入-->图表,选择条形图 3.为美观可将中间竖线可去掉 4.方法是选中竖线,右击-->删除 5.接下来将图例靠上,选中图例,右击-->设置图例格式-->图例选项…

排序算法-选择/堆排序(C语言)

1基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的 数据元素排完 。 2 直接选择排序: 在元素集合 array[i]--array[n-1] 中选择关键码最大 ( 小 ) 的数据元素…

【C/C++ 07】词频统计

一、题目 读入一篇英文短文&#xff0c;去除介词、连词、冠词、副词、代词等非关键性单词后&#xff0c;统计每个单词出现的次数&#xff0c;并将单词按出现次数的降序和单词字符的升序进行显示5个单词。 二、算法 1. 通过<fstream>库创建fstream流对象&#xff0c;并从…

数学建模 - 线性规划入门:Gurobi + python

在工程管理、经济管理、科学研究、军事作战训练及日常生产生活等众多领域中&#xff0c;人们常常会遇到各种优化问题。例如&#xff0c;在生产经营中&#xff0c;我们总是希望制定最优的生产计划&#xff0c;充分利用已有的人力、物力资源&#xff0c;获得最大的经济效益&#…

idea docker 镜像生成太慢太大问题

文章目录 前言一、更小的jdk基础镜像二、服务瘦包&#xff08;thin jar&#xff09;2.1 maven2.2 修改dockerfile2.3 container run options 三、 基础jdk镜像入手&#xff1f;总结 前言 idea docker 内网应用实践遗留问题 idea docker插件 build 服务镜像太慢服务镜像太大 …

【网络】端口号范围

一、端口号的几个范围 在计算机网络中&#xff0c;一个端口号是一个16位的无符号整数&#xff0c;意味着端口号的范围是从0到65535。不过&#xff0c;并非所有端口都可以随意使用。根据惯例和技术标准&#xff0c;端口号被分为几个范围&#xff1a;1. 系统或保留端口&#xff…

草图导入3d后模型贴材质的步骤?---模大狮模型网

3D模型在导入草图大师后出现混乱可能有多种原因&#xff0c;以下是一些可能的原因和解决方法&#xff1a; 模型尺寸问题&#xff1a;如果3D模型的尺寸在导入草图大师时与画布尺寸不匹配&#xff0c;可能导致模型混乱。解决方法是在3D建模软件中调整模型的尺寸&#xff0c;使其适…

ubuntu16.04环境轻松安装和应用opencv4.9.0(基于源码编译)

目录 一、环境准备 1、安装cmake 2、安装依赖 3、从github上下载opencv4.9.0.zip 二、安装opencv4.9.0 1、解压4.9.0.zip 2、进入build目录编译 3、安装编译好的相关库 4、修改opencv配置文件并使其生效 5、添加PKG_CONFIG路径&#xff0c;并使其生效 三、opencv环境…

Redis核心技术与实战【学习笔记】 - 10.浅谈CPU架构对Redis性能的影响

概述 可能很多人都认为 Redis 和 CPU 的关系简单&#xff0c;Redis 的线程在 CPU 上运行&#xff0c;CPU 快 Reids 处理请求的速度也很快。 其实&#xff0c;这种认知是片面的&#xff0c;CPU 的多核架构及多 CPU 结构&#xff0c;也会影响到 Redis 的性能。如果不了解 CPU 对…

STM32存储左右互搏 QSPI总线读写FLASH W25QXX

STM32存储左右互搏 QSPI总线读写FLASH W25QXX FLASH是常用的一种非易失存储单元&#xff0c;W25QXX系列Flash有不同容量的型号&#xff0c;如W25Q64的容量为64Mbit&#xff0c;也就是8MByte。这里介绍STM32CUBEIDE开发平台HAL库Qual SPI总线操作W25Q各型号FLASH的例程。 W25Q…

云上自动部署丨使用 Terraform 在 AWS 上搭建 DolphinDB

HashiCorp Terraform 是一款基础架构即代码工具&#xff0c;旨在实现 "Write, Plan, and Create Infrastructure as Code"。它通过配置文件来描述云资源的拓扑结构&#xff0c;包括虚拟机、存储账户和网络接口。Terraform 几乎支持市面上所有的云服务&#xff0c;能够…

LeetCode --116

116. 填充每个节点的下一个右侧节点指针 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让…

Python 数据处理临近匹配:找到最接近的元素

更多Python学习内容&#xff1a;ipengtao.com 在数据处理中&#xff0c;经常需要找到最接近给定值的元素或数据点。这种需求在科学、工程和统计分析中非常常见。Python 提供了多种方法来实现这种临近匹配。本文将介绍一些常见的方法和示例代码&#xff0c;以帮助大家更好地处理…

探索微服务治理:从发展到实践构建高效稳定的系统|负载均衡技术解析

二、微服务治理的相关技术 微服务治理涉及多个方面&#xff0c;包括服务注册与发现、负载均衡、容错处理、服务配置管理等&#xff0c;这些技术共同确保微服务架构的稳定运行。 2、负载均衡 负载均衡作为服务治理中的核心技术之一&#xff0c;对于提高系统的可用性、性能和扩…

【Axure教程0基础入门】02高保真基础

02高保真基础 1.高保真原型的要素 &#xff08;1&#xff09;静态高保真原型图 尺寸&#xff1a;严格按照截图比例&#xff0c;参考线 色彩&#xff1a;使用吸取颜色&#xff0c;注意渐变色 贴图&#xff1a;矢量图/位图&#xff0c;截取&#xff0c;覆盖等 &#xff08;…

DevOps落地笔记-08|技术债务:勤借勤还,再借不难

上一讲主要介绍了如何有效管理第三方组件的实际案例&#xff0c;目的是让你意识到依赖组件的质量也会影响到软件的质量。前面几个课时谈论的主要内容都是跟软件质量相关&#xff0c;通过各种方式方法提高软件交付的质量。这时就会遇到一个问题&#xff0c;软件质量固然重要&…

c++设计模式之观察者模式(发布-订阅模式)

介绍 观察者模式主要关注于对象的一对多关系&#xff0c;其中多个对象都依赖于一个对象&#xff0c;当该对象的状态发生改变时&#xff0c;其余对象都能接收到相应的通知。 如&#xff0c;现在有 一个数据对象三个画图对象&#xff0c;分别wield曲线图、柱状图、饼状图三个对象…

基于SSM+MySQL的的新闻发布系统设计与实现

目录 项目简介 项目技术栈 项目运行环境 项目截图 代码截取 源码获取 项目简介 新闻发布系统是一款基于Servletjspjdbc的网站应用程序&#xff0c;旨在提供一个全面且高效的新闻发布平台。该系统主要包括后台管理和前台新闻展示两个平台&#xff0c;涵盖了新闻稿件的撰写…