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

React無限滾動加載列表組件的封裝實現(xiàn)

 更新時間:2023年12月21日 09:51:17   作者:樂聞x  
無限下拉加載技術(shù)是用戶在大量成塊的內(nèi)容面前一直滾動查看,本文主要介紹了React無限滾動加載列表組件的封裝實現(xiàn),具有一定的參考價值,感興趣的可以了解一下

前言

由于需要考慮后端接口的性能問題,我們在請求業(yè)務(wù)數(shù)據(jù)列表的時候并不能直接請求全量數(shù)據(jù)。所以我們在請求數(shù)據(jù)時常見的方式是做分頁查詢。

對于前端交互而言,我們需要考慮如何優(yōu)雅的讓用戶觸發(fā)請求下一頁數(shù)據(jù)的接口。常用的方法有兩種:

  • 提供顯示的分頁器,讓用戶自己手動點擊下一頁;
  • 業(yè)務(wù)滾動到某個閾值時自動觸發(fā)下一頁請求;

對于移動端,滾動加載的交互是更加優(yōu)雅的處理方式。對于滾動加載的能力,我們需要一個公共的組件來實現(xiàn)代碼的復(fù)用,避免每次都要為滾動加載的需求傷腦筋。

效果圖

先看效果,增加信心

在這里插入圖片描述

在這里插入圖片描述

準(zhǔn)備工作

滾動事件的參數(shù)中核心屬性

clientWidth可視區(qū)寬度
clientHeight可視區(qū)高度
offsetWidth可視區(qū)寬度
offsetHeight可視區(qū)高度
scrollWidth內(nèi)容實際寬度
scrollHeight內(nèi)容實際高度
scrollTop內(nèi)容頂部距離可視區(qū)頂部距離
scrollLeft內(nèi)容左側(cè)距離可視圖左側(cè)距離

比較直觀的示意圖

在這里插入圖片描述

實現(xiàn)原理

滾動加載的目的是用戶滾動頁面到最底部時可以自動請求下一頁的數(shù)據(jù)接口,所以問題重點是如何確認用戶的頁面滾動到了最底部。

列表觸底的條件:可視區(qū)高度 + 滾動距離 ≥ 內(nèi)容實際高度

offsetHeight + scrollTop ≥ scrollHeight

核心代碼

scrollEvent = async (e) => {
    let scrollHeight = e.target.scrollHeight;
    let scrollTop = e.target.scrollTop;
    let offsetHeight = e.target.offsetHeight;
    if (offsetHeight + scrollTop >= scrollHeight) {
      console.log('列表觸底,觸發(fā)接口請求數(shù)據(jù)');
      this.setState({ loading: true });
      let result = await this.loadData();
      this.setState({
        loading: false,
        list: this.state.list.concat(result),
      });
    }
  };

window.addListener('scroll',()=>scrollEvent())

組件封裝

為了讓代碼能夠更高的得到復(fù)用,將代碼封裝成UI組件是必要的,于是我封裝了一個簡易的React版的無限滾動組件。

組件能力介紹

  • 業(yè)務(wù)方管理數(shù)據(jù)源dataSource,便于個性化業(yè)務(wù)操作;
  • 支持自定義數(shù)據(jù)加載中skeleton;
  • 增加觸發(fā)門檻,減少無效的數(shù)據(jù)請求;
import React, { ReactNode, useEffect, useRef } from 'react'
import classnames from 'classnames'

interface InfiniteScrollListProps<T> {
    loading: boolean
    dataSource: Array<T>
    renderItem: (data: T) => ReactNode
    renderSkeleton?: () => ReactNode
    hasMore: boolean
    loadMore: () => void
    className?: string
}

export default function InfiniteScrollList<T>(props: InfiniteScrollListProps<T>) {
    const { loading, dataSource, renderItem, renderSkeleton, loadMore, hasMore, className } = props

    const containerRef = useRef<HTMLDivElement>(null)

    useEffect(() => {
        const scrollEvent = (event) => {
            if (!hasMore || loading) return
            //可視區(qū)高度
            let scrollHeight = event.target?.scrollHeight
            //滾動高度
            let scrollTop = event.target.scrollTop
            //列表內(nèi)容實際高度
            let offsetHeight = event.target.offsetHeight
            if (offsetHeight + scrollTop >= scrollHeight) {
                console.log('列表觸底')
                loadMore()
            }
        }

        containerRef.current?.addEventListener('scroll', scrollEvent)

        return () => {
            containerRef.current?.removeEventListener('scroll', scrollEvent)
        }
    }, [hasMore, loading])

    return (
        <div className={classnames('flex-1 flex flex-col overflow-y-auto', className)} ref={containerRef}>
            {dataSource.map((data) => {
                return renderItem(data)
            })}
            {loading && new Array(4).fill(0).map(() => renderSkeleton?.())}
        </div>
    )
}

到此這篇關(guān)于React無限滾動加載列表組件的封裝實現(xiàn)的文章就介紹到這了,更多相關(guān)React無限滾動加載列表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React 組件轉(zhuǎn) Vue 組件的命令寫法

    React 組件轉(zhuǎn) Vue 組件的命令寫法

    本文先介紹兩個框架的組件共性和不兼容的地方,再介紹react-to-vue的使用和原理,需要的朋友可以參考下
    2018-02-02
  • React?Native與iOS?OC之間的交互示例詳解

    React?Native與iOS?OC之間的交互示例詳解

    這篇文章主要為大家介紹了React?Native與iOS?OC之間的交互示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • React項目配置prettier和eslint的方法

    React項目配置prettier和eslint的方法

    這篇文章主要介紹了React項目配置prettier和eslint的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • 詳解如何在項目中使用jest測試react native組件

    詳解如何在項目中使用jest測試react native組件

    本篇文章主要介紹了詳解如何在項目中使用jest測試react native組件,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • 基于React.js實現(xiàn)原生js拖拽效果引發(fā)的思考

    基于React.js實現(xiàn)原生js拖拽效果引發(fā)的思考

    這篇文章主要為大家詳細介紹了基于React.js實現(xiàn)原生js拖拽效果,繼而引發(fā)的一系列思考,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • react中將html字符串渲染到頁面的實現(xiàn)方式

    react中將html字符串渲染到頁面的實現(xiàn)方式

    這篇文章主要介紹了react中將html字符串渲染到頁面的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 基于webpack開發(fā)react-cli的詳細步驟

    基于webpack開發(fā)react-cli的詳細步驟

    這篇文章主要介紹了基于webpack開發(fā)react-cli的詳細步驟,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • React前端開發(fā)createElement源碼解讀

    React前端開發(fā)createElement源碼解讀

    這篇文章主要為大家介紹了React前端開發(fā)createElement源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 在console中打印React Fiber樹的操作步驟

    在console中打印React Fiber樹的操作步驟

    React Fiber 是 React 16 中引入的新的協(xié)調(diào)引擎或重寫的核心算法, 真針Fiber的一個重要的核心概念Fiber Node,這次主要的研究對象是: 如何從使用者/學(xué)習(xí) 者角度 在js 代碼上 拿到fiber 樹結(jié)構(gòu)的信息,,需要的朋友可以參考下
    2024-04-04
  • 詳解react如何實現(xiàn)復(fù)合組件

    詳解react如何實現(xiàn)復(fù)合組件

    在一些react項目開發(fā)中,常常會出現(xiàn)一些組合的情況出現(xiàn),這篇文章主要為大家介紹了復(fù)合組件的具體實現(xiàn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-10-10

最新評論

阳西县| 山阴县| 宾川县| 襄樊市| 文山县| 集贤县| 思茅市| 黄平县| 元谋县| 大庆市| 湘西| 兴城市| 五大连池市| 祁阳县| 西藏| 兴化市| 伊吾县| 天津市| 修文县| 武城县| 咸宁市| 滕州市| 阿勒泰市| 霸州市| 托里县| 成武县| 闸北区| 和硕县| 杨浦区| 绵竹市| 嘉禾县| 淅川县| 土默特左旗| 邯郸县| 恩平市| 平罗县| 桂林市| 屯门区| 朝阳区| 永新县| 宁南县|