React无限滚动加载列表组件的封装实现

 更新时间:2023年12月21日 09:51:17   作者:乐闻x  
无限下拉加载技术是用户在大量成块的内容面前一直滚动查看,本文主要介绍了React无限滚动加载列表组件的封装实现,具有一定的参考价值,感兴趣的可以了解一下

前言

由于需要考虑后端接口的性能问题,我们在请求业务数据列表的时候并不能直接请求全量数据。所以我们在请求数据时常见的方式是做分页查询。

对于前端交互而言,我们需要考虑如何优雅的让用户触发请求下一页数据的接口。常用的方法有两种:

  • 提供显示的分页器,让用户自己手动点击下一页;
  • 业务滚动到某个阈值时自动触发下一页请求;

对于移动端,滚动加载的交互是更加优雅的处理方式。对于滚动加载的能力,我们需要一个公共的组件来实现代码的复用,避免每次都要为滚动加载的需求伤脑筋。

效果图

先看效果,增加信心

在这里插入图片描述

在这里插入图片描述

准备工作

滚动事件的参数中核心属性

clientWidth可视区宽度
clientHeight可视区高度
offsetWidth可视区宽度
offsetHeight可视区高度
scrollWidth内容实际宽度
scrollHeight内容实际高度
scrollTop内容顶部距离可视区顶部距离
scrollLeft内容左侧距离可视图左侧距离

比较直观的示意图

在这里插入图片描述

实现原理

滚动加载的目的是用户滚动页面到最底部时可以自动请求下一页的数据接口,所以问题重点是如何确认用户的页面滚动到了最底部。

列表触底的条件:可视区高度 + 滚动距离 ≥ 内容实际高度

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('列表触底,触发接口请求数据');
      this.setState({ loading: true });
      let result = await this.loadData();
      this.setState({
        loading: false,
        list: this.state.list.concat(result),
      });
    }
  };

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

组件封装

为了让代码能够更高的得到复用,将代码封装成UI组件是必要的,于是我封装了一个简易的React版的无限滚动组件。

组件能力介绍

  • 业务方管理数据源dataSource,便于个性化业务操作;
  • 支持自定义数据加载中skeleton;
  • 增加触发门槛,减少无效的数据请求;
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
            //可视区高度
            let scrollHeight = event.target?.scrollHeight
            //滚动高度
            let scrollTop = event.target.scrollTop
            //列表内容实际高度
            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>
    )
}

到此这篇关于React无限滚动加载列表组件的封装实现的文章就介绍到这了,更多相关React无限滚动加载列表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • react-router-dom v6 使用详细示例

    react-router-dom v6 使用详细示例

    这篇文章主要介绍了react-router-dom v6使用详细示例,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-09-09
  • React嵌套组件的构建顺序

    React嵌套组件的构建顺序

    这篇文章主要介绍了React嵌套组件的构建顺序,帮助大家更好的理解和学习使用React,感兴趣的朋友可以了解下
    2021-04-04
  • React Native 环境搭建的教程

    React Native 环境搭建的教程

    本篇文章主要介绍了React Native 环境搭建的教程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • React Router 中实现嵌套路由和动态路由的示例

    React Router 中实现嵌套路由和动态路由的示例

    React Router 是一个非常强大和灵活的路由库,它为 React 应用程序提供了丰富的导航和 URL 管理功能,能够帮助我们构建复杂的单页应用和多页应用,这篇文章主要介绍了React Router 中如何实现嵌套路由和动态路由,需要的朋友可以参考下
    2023-05-05
  • ahooks解决用户多次提交方法示例

    ahooks解决用户多次提交方法示例

    这篇文章主要为大家介绍了ahooks解决用户多次提交的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • React中闭包陷阱的几种情及解决方案

    React中闭包陷阱的几种情及解决方案

    在react中我们使用其提供的Hooks中的useState,useEffect,useCallback 时,可能会造成闭包陷阱,下面我们来看一下出现的情况以及如何解决,感兴趣的小伙伴跟着小编一起来看看吧
    2024-07-07
  • 一起来了解React的Hook

    一起来了解React的Hook

    这篇文章主要为大家详细介绍了React的Hook,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 教你如何从 html 实现一个 react

    教你如何从 html 实现一个 react

    react是一个简单的javascript UI库,用于构建高效、快速的用户界面。它是一个轻量级库,因此很受欢迎。接下来通过本文给大家分享从 html 实现一个 react的方法,一起看看吧
    2021-07-07
  • react项目中redux的调试工具不起作用的解决

    react项目中redux的调试工具不起作用的解决

    这篇文章主要介绍了react项目中redux的调试工具不起作用的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • React组件的生命周期详解

    React组件的生命周期详解

    React是用于构建用户界面的JavaScript库。本文详细讲解了React的生命周期,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论