最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用React-Window實(shí)現(xiàn)虛擬滾動效果的示例代碼

 更新時間:2024年01月26日 13:58:22   作者:慕仲卿  
React-Window?是一個為?React?應(yīng)用程序中高效渲染大數(shù)據(jù)集而設(shè)計(jì)的庫,它基于窗口化或虛擬化的原則運(yùn)行,本文將使用React-Window實(shí)現(xiàn)虛擬滾動效果,感興趣的可以了解下

1. 了解 React-Window

React-Window 是一個為 React 應(yīng)用程序中高效渲染大數(shù)據(jù)集而設(shè)計(jì)的庫。它基于窗口化或虛擬化的原則運(yùn)行,這對于提高數(shù)據(jù)量大的 Web 應(yīng)用程序的性能至關(guān)重要。

2. React-Window 原理

  • 窗口化: React-Window 僅渲染用戶可視區(qū)域中當(dāng)前可見的元素。這最小化了 DOM 元素的數(shù)量,減少內(nèi)存使用并提升性能。
  • DOM 元素的可重用性: 用戶滾動時,React-Window 重用現(xiàn)有的 DOM 元素來展示新項(xiàng),進(jìn)一步提升性能。
  • 簡化的 API: 相比于 React-Virtualized,它提供了更簡單、更流暢的 API,使用起來更容易,同時功能強(qiáng)大。

3. 安裝

通過 npm 安裝 React-Window:

npm install react-window

4. 基本使用

一個基本的列表實(shí)現(xiàn):

import { FixedSizeList as List } from 'react-window';

const MyList = () => (
    <List
        height={150}
        itemCount={1000}
        itemSize={35}
        width={300}
    >
        {({ index, style }) => <div style={style}>Item {index}</div>}
    </List>
);

5. 高級使用案例和示例

5.1 自定義項(xiàng)目渲染器

自定義列表或網(wǎng)格中每個項(xiàng)目的渲染方式。

import { FixedSizeList as List } from 'react-window';

// 偶數(shù)和奇數(shù)項(xiàng)組件
const EvenItem = ({ index }) => <div>Even: Item {index}</div>;
const OddItem = ({ index }) => <div>Odd: Item {index}</div>;

const MyCustomItem = ({ index, style }) => (
    <div style={style}>
        {index % 2 === 0 ? <EvenItem index={index} /> : <OddItem index={index} />}
    </div>
);

const MyList = () => (
    <List
        height={150}
        itemCount={1000}
        itemSize={35}
        width={300}
    >
        {MyCustomItem}
    </List>
);

5.2 動態(tài)加載

結(jié)合數(shù)據(jù)獲取實(shí)現(xiàn)用戶滾動時動態(tài)加載和渲染數(shù)據(jù)。

import { InfiniteLoader, List } from "react-window-infinite-loader";

const loadMoreItems = /* 加載更多項(xiàng)目的函數(shù) */

<InfiniteLoader
    isItemLoaded={/* 檢查項(xiàng)目是否加載的函數(shù) */}
    itemCount={1000}
    loadMoreItems={loadMoreItems}
>
    {({ onItemsRendered, ref }) => (
        <List
            onItemsRendered={onItemsRendered}
            ref={ref}
            {/* 其他屬性 */}
        >
            {/* 項(xiàng)目渲染器 */}
        </List>
    )}
</InfiniteLoader>

有關(guān)此示例的更多詳細(xì)信息,請查看下一章節(jié)。

5.3 性能優(yōu)化

演示減少渲染 DOM 元素的數(shù)量。

// 使用相同的 FixedSizeList 示例,但使用大量數(shù)據(jù)集
<List
    height={150}
    itemCount={100000}
    itemSize={35}
    width={300}
>
    {({ index, style }) => <div style={style}>Item {index}</div>}
</List>

6. 詳細(xì)實(shí)現(xiàn)動態(tài)加載

為了展示如何在使用 Express 構(gòu)建的后端中與 React-Window 結(jié)合實(shí)現(xiàn)動態(tài)加載,我們創(chuàng)建一個示例,前端從后端獲取數(shù)據(jù),用戶通過列表滾動時請求更多數(shù)據(jù)。后端將提供分頁數(shù)據(jù),前端在達(dá)到當(dāng)前加載項(xiàng)的末尾時請求更多數(shù)據(jù)。

使用 Express 的后端設(shè)置

創(chuàng)建一個簡單的 Express 服務(wù)器:

首先,建立一個能夠提供分頁數(shù)據(jù)的 Express 服務(wù)器。

 express = require('express');
const app = express();
const cors = require('cors');
const PORT = 3000;

app.use(cors());
// 模擬數(shù)據(jù)數(shù)組
const data = new Array(1000).fill(null).map((_, index) => ({ id: index, name: `Item ${index}` }));

// 獲取分頁數(shù)據(jù)的端點(diǎn)
app.get('/data', (req, res) => {
    const { page = 1, limit = 50 } = req.query;
    console.log('req.query:', req.query)
    const startIndex = (page - 1) * limit;
    const endIndex = page * limit;
    res.json({
        data: data.slice(startIndex, endIndex),
        total: data.length
    });
});

app.listen(PORT, () => console.log(`Server running on port ${PORT}`));

在這個設(shè)置中,創(chuàng)建了一個模擬數(shù)據(jù)數(shù)組,/data 端點(diǎn)根據(jù)請求的頁碼和限制提供部分?jǐn)?shù)據(jù)。

使用 React-Window 和無限加載的前端設(shè)置

在前端實(shí)現(xiàn)無限加載:

使用 React 和 React-Window 實(shí)現(xiàn)無限加載特性。

import React, { useState, useEffect } from 'react';
import { FixedSizeList as List } from 'react-window';
import axios from 'axios';

const ROW_HEIGHT = 35;

function InfiniteLoadingList() {
    const [items, setItems] = useState([]);
    const [total, setTotal] = useState(0);
    const [page, setPage] = useState(1);

    const loadMoreItems = async () => {
        const { data } = await axios.get(`http://localhost:3000/data?page=${page}&limit=50`);
        setItems(prev => [...prev, ...data.data]);
        setTotal(data.total);
        setPage(prev => prev + 1);
    };

    useEffect(() => {
        loadMoreItems();
    }, []);

    useEffect(() => {
        console.log('items', items);
    }, [items]);

    const isItemLoaded = index => index < items.length;

    const renderItem = ({ index, style }) => (
        <div style={style}>
            {isItemLoaded(index) ? items[index].name : 'Loading...'}
        </div>
    );

    return (
        <List
            height={400}
            itemCount={total}
            itemSize={ROW_HEIGHT}
            width={300}
            onItemsRendered={({ visibleStopIndex }) => {
            console.log('visibleStopIndex:', visibleStopIndex)
                if (!isItemLoaded(visibleStopIndex) && items.length < total) {
                    loadMoreItems();
                }
            }}
        >
            {renderItem}
        </List>
    );
}

export default InfiniteLoadingList;

在這個 React 組件中,使用 useStateuseEffect 管理列表的狀態(tài),并在用戶滾動到已加載項(xiàng)目末尾附近時獲取新數(shù)據(jù)。FixedSizeListonItemsRendered 函數(shù)檢查是否需要加載新數(shù)據(jù)。

總結(jié)

這個設(shè)置展示了在 React 應(yīng)用程序中使用 React-Window 實(shí)現(xiàn)基本的動態(tài)加載和使用 Express 后端提供分頁數(shù)據(jù)的簡單實(shí)現(xiàn)。它有效地展示了如何通過根據(jù)需要逐步加載數(shù)據(jù)來處理大型數(shù)據(jù)集,改善性能和用戶體驗(yàn)。

7. 結(jié)論

React-Window 對于解決 React 應(yīng)用程序中渲染大型數(shù)據(jù)集相關(guān)的性能問題起著關(guān)鍵作用。它對虛擬化的方法,結(jié)合簡化的 API,使其成為開發(fā)者的首選。通過僅渲染可見內(nèi)容并高效地重用 DOM 元素,React-Window 確保即使在數(shù)據(jù)量龐大的情況下,應(yīng)用程序也能保持響應(yīng)性和性能。

到此這篇關(guān)于使用React-Window實(shí)現(xiàn)虛擬滾動效果的示例代碼的文章就介紹到這了,更多相關(guān)React虛擬滾動內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React+Node實(shí)現(xiàn)大文件分片上傳、斷點(diǎn)續(xù)傳秒傳思路

    React+Node實(shí)現(xiàn)大文件分片上傳、斷點(diǎn)續(xù)傳秒傳思路

    本文主要介紹了React+Node實(shí)現(xiàn)大文件分片上傳、斷點(diǎn)續(xù)傳秒傳思路,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • React組件、狀態(tài)管理、代碼優(yōu)化的技巧

    React組件、狀態(tài)管理、代碼優(yōu)化的技巧

    文章總結(jié)了React組件設(shè)計(jì)、狀態(tài)管理、代碼組織和優(yōu)化的技巧,它涵蓋了使用Fragment、props解構(gòu)、defaultProps、key和ref的使用、渲染性能優(yōu)化等方面
    2024-11-11
  • React Native可復(fù)用 UI分離布局組件和狀態(tài)組件技巧

    React Native可復(fù)用 UI分離布局組件和狀態(tài)組件技巧

    這篇文章主要為大家介紹了React Native可復(fù)用 UI分離布局組件和狀態(tài)組件使用技巧,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 基于React?Hooks的小型狀態(tài)管理詳解

    基于React?Hooks的小型狀態(tài)管理詳解

    本文主要介紹一種基于?React?Hooks?的狀態(tài)共享方案,介紹其實(shí)現(xiàn),并總結(jié)一下使用感受,目的是在狀態(tài)管理方面提供多一種選擇方式。感興趣的小伙伴可以了解一下
    2021-12-12
  • React?Context用法小結(jié)(附完整代碼)

    React?Context用法小結(jié)(附完整代碼)

    這篇文章主要介紹了React?Context用法小結(jié)(附完整代碼),Context提供了一種新的組件之間共享數(shù)據(jù)的方式,允許數(shù)據(jù)隔代傳遞,而不必顯式的通過組件樹逐層傳遞props,本文通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • webpack3+React 的配置全解

    webpack3+React 的配置全解

    本篇文章主要介紹了webpack3+React 的配置全解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • react-native使用leanclound消息推送的方法

    react-native使用leanclound消息推送的方法

    這篇文章主要介紹了react-native使用leanclound消息推送的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • React中swiper的配置(reactjs-swiper)

    React中swiper的配置(reactjs-swiper)

    本文詳述了在React項(xiàng)目中使用reactjs-swiper組件的步驟與技巧,包括安裝、配置、解決swiperOptions無效問題及組件掛載,下面就來詳細(xì)的介紹一下
    2026-06-06
  • 如何不使用eject修改create-react-app的配置

    如何不使用eject修改create-react-app的配置

    許多剛開始接觸create-react-app框架的同學(xué),不免都會有個疑問:如何在不執(zhí)行eject操作的同時,修改create-react-app的配置。
    2021-04-04
  • React?Native項(xiàng)目設(shè)置路徑別名示例

    React?Native項(xiàng)目設(shè)置路徑別名示例

    這篇文章主要為大家介紹了React?Native項(xiàng)目設(shè)置路徑別名實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05

最新評論

平定县| 泽州县| 汕尾市| 二连浩特市| 上高县| 亚东县| 施秉县| 东莞市| 杭锦后旗| 靖州| 信宜市| 常德市| 尚义县| 西峡县| 民丰县| 东辽县| 水城县| 襄汾县| 玉环县| 曲松县| 泰兴市| 阿勒泰市| 井研县| 黔南| 正镶白旗| 瑞昌市| 建水县| 汤原县| 泸溪县| 独山县| 木兰县| 许昌县| 泌阳县| 清新县| 东源县| 自贡市| 金昌市| 阿尔山市| 舒兰市| 江都市| 新安县|