虚拟列表react-virtualized使用(npm install react-virtualized)

  1. 虚拟化列表 (List)

    // 1. 虚拟化列表 (List)

    import { List } from 'react-virtualized';
    import 'react-virtualized/styles.css'; // 只导入一次样式

    // 示例数据
    const list = Array(1000).fill().map((_, index) => ({
    id: index,
    name: Item ${index},
    description: This is item number ${index} in the list
    }));

    function Index() {
    const rowRenderer = ({ index, key, style }) => {
    const item = list[index];
    return (


    {item.name}


    {item.description}



    );
    };

    复制代码
     return (
         <List
             width={600} // 列表宽度
             height={400} // 列表高度
             rowCount={list.length} // 总行数
             rowHeight={80} // 每行高度
             rowRenderer={rowRenderer} // 行渲染函数
             overscanRowCount={5} // 预渲染的行数
         />
     )

    }

    export default Index;

  2. 可变高度列表 (CellMeasurer)

    // 2. 可变高度列表 (CellMeasurer)

    import { List, CellMeasurer, CellMeasurerCache } from 'react-virtualized';
    import 'react-virtualized/styles.css';

    // 可变高度数据
    const variableData = Array(500).fill().map((_, index) => ({
    id: index,
    title: Item ${index},
    content: This is item ${index}. .repeat(Math.floor(Math.random() * 10) + 1)
    }));

    function Index() {
    // 创建测量缓存
    const cache = new CellMeasurerCache({
    defaultHeight: 60,
    fixedWidth: true
    });

    复制代码
     const rowRenderer = ({ index, key, parent, style }) => {
         const item = variableData[index];
    
         return (
             <CellMeasurer
                 key={key}
                 cache={cache}
                 parent={parent}
                 columnIndex={0}
                 rowIndex={index}
             >
                 <div style={style} className="variable-item">
                     <h3>{item.title}</h3>
                     <p>{item.content}</p>
                 </div>
             </CellMeasurer>
         );
     };
    
     return (
         <List
             width={600} // 列表宽度
             height={400} // 列表高度
             deferredMeasurementCache={cache}
             rowHeight={cache.rowHeight} // 每行高度
             rowCount={variableData.length} // 总行数
             rowRenderer={rowRenderer} // 行渲染函数
             overscanRowCount={3} // 预渲染的行数
         />
     )

    }

    export default Index;

  3. 无限加载列表 - 高度固定

    // 3. 无限加载列表 - 高度固定

    import React, { useState } from 'react';
    import { List, AutoSizer } from 'react-virtualized';
    import 'react-virtualized/styles.css';

    function InfiniteLoadingList() {
    const [items, setItems] = useState(
    Array(50).fill().map((_, i) => ({ id: i, name: Item ${i} }))
    );
    const [loading, setLoading] = useState(false);

    const loadMoreItems = () => {
    if (loading) return;

    复制代码
     setLoading(true);
     
     // 模拟API调用
     setTimeout(() => {
       const newItems = Array(50).fill().map((_, i) => ({
         id: items.length + i,
         name: `Item ${items.length + i}`
       }));
       
       setItems(prev => [...prev, ...newItems]);
       setLoading(false);
     }, 1000);

    };

    const isRowLoaded = ({ index }) => index < items.length;

    const rowRenderer = ({ index, key, style }) => {
    if (!isRowLoaded({ index })) {
    return (


    Loading...

    );
    }

    复制代码
     const item = items[index];
     return (
       <div key={key} style={style} className="list-item">
         {item.name}
       </div>
     );

    };

    const onRowsRendered = ({ stopIndex }) => {
    if (stopIndex >= items.length - 10 && !loading) {
    loadMoreItems();
    }
    };

    return (
    <div style={{ height: '500px', width: '100%' }}>
    <AutoSizer>
    {({ width, height }) => (
    <List
    width={width}
    height={height}
    rowCount={items.length + 1} // +1 for loading row
    rowHeight={50}
    rowRenderer={rowRenderer}
    onRowsRendered={onRowsRendered}
    overscanRowCount={5}
    />
    )}
    </AutoSizer>
    {loading &&

    Loading more items...
    }

);
}

export default InfiniteLoadingList;

  • 无限加载列表 - 高度不固定

    // 4. 无限加载列表 - 高度不固定

  • 相关推荐
    隔壁小邓几秒前
    vue如何拆分业务逻辑
    前端·javascript·vue.js
    En^_^Joy4 分钟前
    Ajax与Axios:现代前端异步请求指南
    前端·javascript·ajax
    Cobyte8 分钟前
    来,实现一个 Mini Claude Code:从底层理解 AI Agent
    前端·aigc·ai编程
    SuperEugene8 分钟前
    Vue3 + Element Plus 表单校验实战:规则复用、自定义校验、提示语统一,告别混乱避坑|表单与表格规范篇
    开发语言·前端·javascript·vue.js·前端框架
    酉鬼女又兒12 分钟前
    零基础快速入门前端JavaScript 浏览器环境输入输出语句全解析:从弹框交互到控制台调试(可用于备赛蓝桥杯Web应用开发赛道)
    前端·javascript·职场和发展·蓝桥杯·js
    清汤饺子12 分钟前
    搞懂 Cursor 后,我一行代码都不敲了《实战篇》
    前端·javascript·后端
    SuperEugene13 分钟前
    Vue3 + Element Plus 表格查询规范:条件管理、分页联动 + 避坑,标准化写法|表单与表格规范篇
    开发语言·前端·javascript·vue.js·前端框架
    问道飞鱼20 分钟前
    【前端知识】React生态你了解多少?
    前端·react.js·前端框架·生态
    Pu_Nine_921 分钟前
    前端SSE(Server-Sent Events)实现详解:从原理到前端AI对话应用
    前端·langchain·sse·ai对话
    optimistic_chen31 分钟前
    【Vue3入门】Pinia 状态管理 和 ElementPlus组件库
    前端·javascript·vue.js·elementui·pinia·组件