当前位置:首页 > React

react实现刷新加载

2026-01-27 02:06:14React

React 实现下拉刷新与上拉加载

下拉刷新实现方法

使用第三方库如react-pull-to-refresh简化实现 安装依赖:npm install react-pull-to-refresh

import PullToRefresh from 'react-pull-to-refresh';

function App() {
  const handleRefresh = () => {
    return new Promise((resolve) => {
      // 模拟异步操作
      setTimeout(() => {
        // 实际应替换为数据获取逻辑
        resolve();
      }, 1000);
    });
  };

  return (
    <PullToRefresh onRefresh={handleRefresh}>
      <div>下拉刷新内容区域</div>
    </PullToRefresh>
  );
}

自定义实现方案:

import { useState, useRef } from 'react';

function RefreshWrapper({ children, onRefresh }) {
  const [loading, setLoading] = useState(false);
  const startY = useRef(0);

  const handleTouchStart = (e) => {
    startY.current = e.touches[0].clientY;
  };

  const handleTouchMove = (e) => {
    if (window.scrollY === 0 && e.touches[0].clientY - startY.current > 50) {
      setLoading(true);
      onRefresh().finally(() => setLoading(false));
    }
  };

  return (
    <div 
      onTouchStart={handleTouchStart}
      onTouchMove={handleTouchMove}
    >
      {loading && <div>加载中...</div>}
      {children}
    </div>
  );
}

上拉加载更多实现

react实现刷新加载

使用Intersection Observer API检测滚动到底部:

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

function InfiniteScroll({ loadMore }) {
  const [page, setPage] = useState(1);
  const observerTarget = useRef(null);

  useEffect(() => {
    const observer = new IntersectionObserver(
      entries => {
        if (entries[0].isIntersecting) {
          loadMore(page).then(() => {
            setPage(p => p + 1);
          });
        }
      },
      { threshold: 1.0 }
    );

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

    return () => {
      if (observerTarget.current) {
        observer.unobserve(observerTarget.current);
      }
    };
  }, [page, loadMore]);

  return (
    <div>
      {/* 内容列表 */}
      <div ref={observerTarget} style={{ height: '20px' }}></div>
    </div>
  );
}

优化建议

  1. 节流处理滚动事件,避免频繁触发

    react实现刷新加载

    const throttle = (func, delay) => {
    let lastCall = 0;
    return function(...args) {
     const now = new Date().getTime();
     if (now - lastCall < delay) return;
     lastCall = now;
     return func(...args);
    };
    };
  2. 添加加载状态提示

    {isLoading && (
    <div style={{ padding: '10px', textAlign: 'center' }}>
     <span>加载更多数据...</span>
    </div>
    )}
  3. 数据全部加载完成后显示提示

    {isComplete && (
    <div style={{ padding: '10px', textAlign: 'center' }}>
     <span>已加载全部数据</span>
    </div>
    )}

常见问题处理

  • 防止重复请求:在加载状态未完成时锁定请求
  • 网络错误处理:添加错误捕获和重试机制
  • 列表空状态:显示友好提示信息
  • 内存管理:大数据量时考虑虚拟滚动方案

标签: 加载react
分享给朋友:

相关文章

vue滚动加载实现

vue滚动加载实现

vue滚动加载实现 滚动加载是一种常见的优化手段,通过监听滚动事件动态加载数据,减少初始渲染压力。以下是几种实现方式: 使用IntersectionObserver API Intersectio…

vue2实现图片懒加载

vue2实现图片懒加载

实现图片懒加载的方法 在Vue2中实现图片懒加载可以通过以下方法完成,核心原理是监听图片是否进入可视区域,再动态加载图片资源。 使用IntersectionObserver API Interse…

react native如何启动

react native如何启动

如何启动 React Native 项目 安装 Node.js 和 npm 确保已安装 Node.js(建议版本 16 或更高)和 npm(Node.js 自带)。可通过以下命令检查版本: nod…

react 如何执行

react 如何执行

安装 Node.js 和 npm React 开发需要 Node.js 环境,因为它提供了 npm(或 yarn)包管理工具。从 Node.js 官网 下载并安装最新 LTS 版本。安装完成后,在终端…

如何react页面

如何react页面

创建 React 页面 使用 create-react-app 快速初始化项目: npx create-react-app my-app cd my-app npm start 基础页面结构 在…

react如何收录

react如何收录

React 收录方法 React 的收录主要涉及搜索引擎优化(SEO)和预渲染技术。由于 React 是单页应用(SPA),默认情况下内容由 JavaScript 动态生成,可能导致搜索引擎爬虫难以收…