当前位置:首页 > React

react无限滚动列表实现

2026-01-27 12:39:29React

无限滚动列表实现方法

无限滚动列表(Infinite Scroll)是一种常见的UI模式,通过监听滚动事件动态加载更多数据,避免一次性渲染大量DOM节点。React中可通过以下方法实现:

react无限滚动列表实现

使用Intersection Observer API

Intersection Observer是现代浏览器提供的API,可高效检测元素是否进入视口。

react无限滚动列表实现

import { useState, useEffect, useRef } from 'react';

function InfiniteScrollList({ fetchData }) {
  const [items, setItems] = useState([]);
  const [page, setPage] = useState(1);
  const loaderRef = useRef(null);

  useEffect(() => {
    const observer = new IntersectionObserver((entries) => {
      if (entries[0].isIntersecting) {
        loadMore();
      }
    });

    if (loaderRef.current) {
      observer.observe(loaderRef.current);
    }

    return () => observer.disconnect();
  }, []);

  const loadMore = async () => {
    const newItems = await fetchData(page);
    setItems(prev => [...prev, ...newItems]);
    setPage(prev => prev + 1);
  };

  return (
    <div>
      {items.map(item => (
        <div key={item.id}>{item.content}</div>
      ))}
      <div ref={loaderRef}>Loading more...</div>
    </div>
  );
}

使用滚动事件监听

传统方法通过监听滚动事件计算位置,需注意性能优化。

import { useState, useEffect } from 'react';

function InfiniteScrollList({ fetchData }) {
  const [items, setItems] = useState([]);
  const [page, setPage] = useState(1);
  const [loading, setLoading] = useState(false);

  useEffect(() => {
    window.addEventListener('scroll', handleScroll);
    return () => window.removeEventListener('scroll', handleScroll);
  }, [items]);

  const handleScroll = () => {
    if (
      window.innerHeight + document.documentElement.scrollTop >=
      document.documentElement.offsetHeight - 100 &&
      !loading
    ) {
      loadMore();
    }
  };

  const loadMore = async () => {
    setLoading(true);
    const newItems = await fetchData(page);
    setItems(prev => [...prev, ...newItems]);
    setPage(prev => prev + 1);
    setLoading(false);
  };

  return (
    <div>
      {items.map(item => (
        <div key={item.id}>{item.content}</div>
      ))}
      {loading && <div>Loading...</div>}
    </div>
  );
}

使用第三方库

现有成熟库如react-infinite-scroll-component可快速实现:

import InfiniteScroll from 'react-infinite-scroll-component';

function InfiniteScrollList({ fetchData }) {
  const [items, setItems] = useState([]);
  const [page, setPage] = useState(1);
  const [hasMore, setHasMore] = useState(true);

  const loadMore = async () => {
    const newItems = await fetchData(page);
    setItems(prev => [...prev, ...newItems]);
    setPage(prev => prev + 1);
    setHasMore(newItems.length > 0);
  };

  return (
    <InfiniteScroll
      dataLength={items.length}
      next={loadMore}
      hasMore={hasMore}
      loader={<h4>Loading...</h4>}
    >
      {items.map(item => (
        <div key={item.id}>{item.content}</div>
      ))}
    </InfiniteScroll>
  );
}

性能优化建议

  • 对长列表使用虚拟滚动技术(如react-window
  • 避免在滚动事件中进行复杂计算
  • 添加防抖/节流控制触发频率
  • 确保每个列表项有稳定的key
  • 考虑实现数据缓存机制

错误处理

  • 添加加载失败重试机制
  • 处理API请求错误情况
  • 显示适当的空状态和错误提示

标签: 列表react
分享给朋友:

相关文章

如何手写一个react

如何手写一个react

手写一个简单的 React 创建一个基础的 React 实现需要理解其核心概念:虚拟 DOM、组件、状态管理和渲染。以下是一个简化版的 React 实现。 创建虚拟 DOM 虚拟 DOM 是真实 D…

react 如何启动

react 如何启动

创建 React 项目 使用官方工具 create-react-app 快速初始化项目,需提前安装 Node.js(版本 ≥ 14.0.0)和 npm/yarn: npx create-react-…

react如何重置

react如何重置

重置 React 应用的状态 使用 useState 钩子重新初始化状态变量是最直接的方法。将状态变量重置为初始值或空值即可完成重置。 const [count, setCount] = useSt…

react如何重启

react如何重启

重启 React 应用的方法 重新加载当前页面 使用 window.location.reload() 强制刷新页面,这会重新加载整个应用并重置所有状态。 window.location…

react如何配置

react如何配置

配置React项目的基本步骤 安装Node.js和npm 确保系统已安装Node.js(包含npm)。可通过命令行检查版本: node -v npm -v 创建React项目 使用官方工具Creat…

react路由如何配置

react路由如何配置

React 路由配置方法 安装 React Router 使用 npm 或 yarn 安装 React Router 的 DOM 版本: npm install react-router-dom #…