当前位置: 首页 > news >正文

阿里巴巴网站推广方法免费网络推广网站大全

阿里巴巴网站推广方法,免费网络推广网站大全,佛山网站seo推广推荐,百度seo关键词外包在 React 中使用 Intersection Observer API 实现触底加载分页&#xff08;无限滚动&#xff09;1.基本实现思路 在列表底部放置一个 哨兵元素&#xff08;Sentinel&#xff09;&#xff08;如 <div>&#xff09;。使用 IntersectionObserver 监听该元素是否进入视口&…

在 React 中使用 Intersection Observer API 实现触底加载分页(无限滚动)

1.基本实现思路

  • 在列表底部放置一个 哨兵元素(Sentinel)(如 <div>)。
  • 使用 IntersectionObserver 监听该元素是否进入视口(即触底)。
  • 触底时加载下一页数据,并更新列表。

2.完整代码实例

import { useState, useEffect, useRef } from 'react';function InfiniteScrollList() {const [data, setData] = useState([]); // 当前数据const [page, setPage] = useState(1);  // 当前页码const [loading, setLoading] = useState(false); // 加载状态const [hasMore, setHasMore] = useState(true);  // 是否还有更多数据const sentinelRef = useRef(null); // 哨兵元素的 ref// 模拟异步加载数据const fetchData = async () => {if (loading || !hasMore) return;setLoading(true);// 模拟 API 请求(替换为实际接口)const mockData = Array.from({ length: 10 }, (_, i) => `Item ${(page - 1) * 10 + i + 1}`);// 模拟延迟await new Promise(resolve => setTimeout(resolve, 1000));setData(prev => [...prev, ...mockData]);setPage(prev => prev + 1);setLoading(false);// 假设第 5 页后无数据if (page >= 5) setHasMore(false);};// 初始化 IntersectionObserveruseEffect(() => {if (!sentinelRef.current || !hasMore) return;const observer = new IntersectionObserver((entries) => {const [entry] = entries;if (entry.isIntersecting) {fetchData(); // 触底时加载数据}},{ threshold: 1.0 } // 当哨兵元素完全进入视口时触发);observer.observe(sentinelRef.current);return () => {if (sentinelRef.current) observer.unobserve(sentinelRef.current);};}, [page, hasMore, loading]); // 依赖项return (<div style={{ maxHeight: '400px', overflow: 'auto' }}><h2>无限滚动列表</h2><ul>{data.map((item, index) => (<li key={index} style={{ padding: '10px', borderBottom: '1px solid #eee' }}>{item}</li>))}</ul>{/* 哨兵元素:用于检测触底 */}<div ref={sentinelRef} style={{ height: '20px' }}>{loading && <p>加载中...</p>}{!hasMore && <p>没有更多数据了</p>}</div></div>);
}export default InfiniteScrollList;

3.关键点说明

  1. 哨兵元素(Sentinel)

    • 一个隐藏的 <div> 作为触底标记,通过 ref 绑定到 IntersectionObserver
  2. IntersectionObserver 配置

    • threshold: 1.0:当哨兵元素 100% 进入视口时触发回调。
    • useEffect 中初始化并清理观察器,避免内存泄漏。
  3. 加载控制逻辑

    • loading 防止重复请求。
    • hasMore 标记数据是否全部加载完毕。
  4. 性能优化

    • 使用 useCallback 包裹 fetchData(如果函数逻辑复杂)。
    • 实际项目中,结合分页接口的 total 字段判断是否还有数据。

4.实际项目适配

  • 替换 fetchData 中的模拟请求为真实 API 调用(如 axios 或 fetch)。
  • 可加入防抖(Debounce)优化频繁触发问题(如快速滚动时)。
http://www.dtcms.com/a/487792.html

相关文章:

  • 信息分类网站建设字节跳动员工人数多少
  • Android 如何开启 16KB 模式
  • VOFA添加取消光标标记使用方法
  • 【学习笔记】大模型慢思考模式的优缺点
  • 精读《JavaScript 高级程序设计 第4版》第12章 BOM
  • 临桂城乡建设局网站开源wordpress
  • BRPC基础使用
  • 如何用网站模板建设网站南京模板建网站哪家好
  • 称多县公司网站建设网上做家教那个网站好
  • 做家装模型的效果图网站宁德市住房和城乡建设局网站
  • Burp Suite抓包软件使用说明1-Http history
  • 买了两台服务器可以做网站吗不起眼的暴利小生意
  • glibc升级到指定版本
  • 做一个智能体搭建复盘吧
  • 销售网站建设的意义企业网站建设策划书 前言
  • 做房产网站在百度推广推广费前端素材网
  • 家政服务网站建设方案建筑建设网站
  • DirectShow帮助文档
  • No032:休眠的智慧——当DeepSeek学会在静默中更新
  • 注册什么公司给别人做网站成都市房产透明网官网
  • 租车网站 模板提供中山精品网站建设
  • 用于设计和验证自动驾驶系统的场景库
  • 做网站的抬头怎么做wordpress开发ide
  • 数字图像处理绪论
  • UVa 12494 Distinct Substring
  • 【Linux】Linux进程间通信:命名管道(FIFO)的模拟实现重要知识点梳理
  • 做网站时怎么裁切存图最佳建站模板
  • 020网站建设如何保护我做的网站模板
  • Escrcpy 安卓手机投屏软件中文绿色版
  • 大模型实习