当前位置:首页 > 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
分享给朋友:

相关文章

react 如何继承

react 如何继承

在React中,组件继承并非推荐的设计模式(官方更推崇组合优于继承),但技术上仍可通过以下方式实现类似效果: 使用ES6类继承 通过extends关键字继承父组件类,子组件可访问父组件的生命周期方法…

如何优化react

如何优化react

优化 React 性能的方法 使用 React.memo 或 PureComponent 对于函数组件,使用 React.memo 进行记忆化,避免不必要的重新渲染。类组件可以使用 PureCompo…

react如何验证

react如何验证

表单验证方法 在React中验证表单数据通常使用以下几种方式: 内置HTML5验证 利用HTML5原生表单验证属性如required、pattern等,结合form.noValidate属性禁用浏览…

如何调试react

如何调试react

调试 React 应用的方法 使用 React Developer Tools 安装浏览器扩展(Chrome/Firefox),通过组件树查看组件状态、props 和 hooks。支持实时编辑 pro…

react如何重启

react如何重启

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

react如何debugger

react如何debugger

调试 React 应用的方法 使用浏览器开发者工具进行调试 React 开发者工具(React DevTools)是调试 React 应用的必备工具。安装 Chrome 或 Firefox 扩展后,可…