当前位置:首页 > 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>
  );
}

上拉加载更多实现

使用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. 节流处理滚动事件,避免频繁触发

    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实现刷新加载

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

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

相关文章

vue加载动画实现

vue加载动画实现

Vue 加载动画的实现方法 在 Vue 中实现加载动画可以通过多种方式完成,以下是一些常见的方法: 使用 CSS 动画 通过 CSS 定义动画效果,结合 Vue 的动态类绑定或条件渲染控制动画的显示…

vue实现加载

vue实现加载

Vue 实现加载功能的方法 使用 v-if 或 v-show 控制加载状态 在模板中通过 v-if 或 v-show 控制加载动画的显示与隐藏。v-if 会完全移除 DOM 元素,而 v-show 仅…

react如何更新

react如何更新

更新 React 版本的方法 检查当前 React 版本 运行以下命令查看项目中安装的 React 版本: npm list react 更新 React 及相关依赖 通过 npm 或 yarn…

如何同步react

如何同步react

同步React组件状态的方法 使用useState和useEffect钩子组合可以同步React组件的状态。useState用于声明状态变量,useEffect用于监听状态变化并执行副作用。 imp…

如何开发react

如何开发react

开发React应用的基本步骤 安装Node.js和npm 确保系统中已安装Node.js(包含npm)。可通过官网下载安装包,安装后验证版本: node -v npm -v 创建React项目…

理解如何react

理解如何react

理解React的核心概念 React是一个用于构建用户界面的JavaScript库,专注于通过组件化开发提高代码的可维护性和复用性。其核心思想包括虚拟DOM(Virtual DOM)和单向数据流,能够…