当前位置:首页 > React

React下拉刷新实现

2026-01-27 05:17:59React

使用 react-pull-to-refresh 库

安装 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>
  );
}

自定义实现下拉刷新

监听 touch 事件实现基础下拉效果:

React下拉刷新实现

import { useState, useRef } from 'react';

function PullRefresh() {
  const [loading, setLoading] = useState(false);
  const startY = useRef(0);
  const [translateY, setTranslateY] = useState(0);

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

  const handleTouchMove = (e) => {
    const y = e.touches[0].pageY;
    const diff = y - startY.current;
    if (diff > 0 && window.scrollY === 0) {
      setTranslateY(Math.min(diff, 100));
    }
  };

  const handleTouchEnd = () => {
    if (translateY > 60) {
      setLoading(true);
      // 执行刷新操作
      setTimeout(() => {
        setLoading(false);
        setTranslateY(0);
      }, 1000);
    } else {
      setTranslateY(0);
    }
  };

  return (
    <div
      onTouchStart={handleTouchStart}
      onTouchMove={handleTouchMove}
      onTouchEnd={handleTouchEnd}
      style={{ transform: `translateY(${translateY}px)` }}
    >
      {loading && <div>加载中...</div>}
      <div>页面内容</div>
    </div>
  );
}

使用 react-swipeable 库增强手势

安装依赖:

npm install react-swipeable

结合手势库实现:

React下拉刷新实现

import { useSwipeable } from 'react-swipeable';

function SwipeRefresh({ onRefresh }) {
  const [pull, setPull] = useState(0);

  const handlers = useSwipeable({
    onSwiping: (e) => {
      if (window.scrollY === 0 && e.dir === 'Down') {
        setPull(Math.min(e.deltaY, 100));
      }
    },
    onSwiped: () => {
      if (pull > 60) {
        onRefresh().then(() => setPull(0));
      } else {
        setPull(0);
      }
    }
  });

  return (
    <div {...handlers}>
      <div style={{ height: `${pull}px` }}>
        {pull > 60 ? '释放刷新' : '下拉刷新'}
      </div>
      <div>页面内容</div>
    </div>
  );
}

移动端优化建议

添加弹性动画效果:

.refresh-indicator {
  transition: transform 0.3s cubic-bezier(0.2, 0.8, 0.4, 1);
}

防止页面滚动冲突:

useEffect(() => {
  const preventDefault = (e) => {
    if (translateY > 0) {
      e.preventDefault();
    }
  };
  document.addEventListener('touchmove', preventDefault, { passive: false });
  return () => document.removeEventListener('touchmove', preventDefault);
}, [translateY]);

标签: React
分享给朋友:

相关文章

React中如何引入koa

React中如何引入koa

React 中引入 Koa 的方法 React 是前端框架,而 Koa 是 Node.js 的后端框架。通常两者结合使用时,React 作为前端应用运行在浏览器中,Koa 作为后端服务提供 API 接…

React中如何监听state的变化

React中如何监听state的变化

监听state变化的常用方法 在React中,监听state变化可以通过以下几种方式实现: 使用useEffect钩子 import { useState, useEffect } from 'r…

React实现打印word

React实现打印word

使用React实现打印Word文档 在React中实现打印Word文档功能,可以通过以下几种方法实现: 方法一:使用第三方库react-to-print 安装react-to-print库: n…

React实现文档预览

React实现文档预览

实现文档预览的方法 在React中实现文档预览可以通过多种方式完成,具体取决于文档类型和需求。以下是几种常见的方法: 使用第三方库预览PDF 安装react-pdf库,该库专门用于在React中渲染…

React实现动态导航

React实现动态导航

React 动态导航实现方法 使用 React Router 和状态管理 安装必要依赖: npm install react-router-dom 创建路由配置文件: // routes.js…

React如何阻断render刷新

React如何阻断render刷新

使用 React.memo 进行组件记忆 React.memo 是一个高阶组件,用于对函数组件进行浅比较。当父组件重新渲染时,如果传递给子组件的 props 没有变化,React.memo 会阻止子组…