当前位置:首页 > 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 事件实现基础下拉效果:

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

结合手势库实现:

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

防止页面滚动冲突:

React下拉刷新实现

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

标签: React
分享给朋友:

相关文章

React如何获取li

React如何获取li

获取单个 <li> 元素 在 React 中,可以通过 ref 直接获取 DOM 元素。使用 useRef 钩子创建引用,并将其绑定到目标 <li> 元素上。 imp…

React如何开发大型项目

React如何开发大型项目

React开发大型项目的关键方法 模块化与组件拆分 将UI拆分为可复用的独立组件,遵循单一职责原则。使用容器组件管理状态,展示组件处理UI渲染。结合Atomic Design或类似方法论组织组件层级。…

React如何访问子组件dom

React如何访问子组件dom

使用 ref 和 React.forwardRef 父组件通过 ref 直接访问子组件的 DOM 节点。子组件需要使用 React.forwardRef 将 ref 转发到内部的 DOM 元素。…

React如何让modal可以被拖动

React如何让modal可以被拖动

实现可拖动Modal的方法 在React中实现可拖动的Modal,可以通过结合HTML5的拖拽API或第三方库如react-draggable来完成。以下是两种常用方法的详细说明: 使用react-…

React原生实现menu

React原生实现menu

React 原生实现菜单 在React中实现菜单功能可以通过多种方式完成,以下是几种常见的方法: 使用状态管理控制菜单显示 通过React的useState钩子管理菜单的显示状态,结合点击事件触发状…

React实现浏览文件

React实现浏览文件

文件选择基础实现 使用HTML的<input type="file">元素结合React状态管理实现基础文件选择功能: import { useState } from 'react';…