본문 바로가기

WEB개발/REACT

pull to refresh

React에서 Pull to Refresh(당겨서 새로고침) 기능은 모바일 웹앱이나 하이브리드 앱에서 자주 쓰이는 UI 패턴이에요.
보통 사용자가 화면을 위로 스크롤할 수 없을 때, 화면을 아래로 끌면 데이터를 새로 불러오는 동작을 수행합니다.

✅ 구현 방법은 크게 3가지입니다


1. 라이브러리 사용 (가장 간단하고 안정적)
대표적으로 다음과 같은 라이브러리를 사용합니다.

`react-pull-to-refresh` 가장 많이 쓰이는 경량 라이브러리입니다.

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

function App() {
  const handleRefresh = async () => {
    // 새로고침 동작 (예: 서버 데이터 다시 불러오기)
    await new Promise(resolve => setTimeout(resolve, 1500));
    alert('새로고침 완료!');
  };

  return (
    <PullToRefresh onRefresh={handleRefresh}>
      <div
        style={{
          height: '100vh',
          overflow: 'auto',
          padding: 20,
        }}
      >
        <h2>Pull down to refresh 👇</h2>
        <p>스크롤을 아래로 당겨보세요!</p>
      </div>
    </PullToRefresh>
  );
}

export default App;

 


2. React + touchstart, touchmove, touchend로 직접 구현
조금 더 세밀하게 제어하고 싶다면 터치 이벤트를 직접 처리할 수 있습니다.

 

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

function CustomPullToRefresh({ onRefresh, children }) {
  const [pulling, setPulling] = useState(false);
  const startY = useRef(0);
  const threshold = 70; // 새로고침 인식 거리

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

  const handleTouchMove = (e) => {
    const distance = e.touches[0].clientY - startY.current;

    if (distance > threshold) {
      setPulling(true);
    }
  };

  const handleTouchEnd = async () => {
    if (pulling) {
      await onRefresh();
    }

    setPulling(false);
  };

  return (
    <div
      onTouchStart={handleTouchStart}
      onTouchMove={handleTouchMove}
      onTouchEnd={handleTouchEnd}
      style={{
        transition: 'transform 0.2s',
        transform: pulling ? 'translateY(50px)' : 'none',
      }}
    >
      {pulling && (
        <div style={{ textAlign: 'center' }}>
          🔄 새로고침 중...
        </div>
      )}

      {children}
    </div>
  );
}

export default function App() {
  const refresh = () =>
    new Promise((resolve) =>
      setTimeout(
        () => resolve(alert('데이터 새로고침 완료!')),
        1000
      )
    );

  return (
    <CustomPullToRefresh onRefresh={refresh}>
      <div style={{ padding: 20 }}>
        <h2>커스텀 Pull To Refresh</h2>
        <p>손가락으로 아래로 당겨보세요.</p>
      </div>
    </CustomPullToRefresh>
  );
}

 

'WEB개발 > REACT' 카테고리의 다른 글

vite-plugin-route-meta  (0) 2026.01.15
react router (navigate)  (0) 2025.12.17
[hook] useCallback  (0) 2025.12.16
[hook] useEffect  (0) 2025.12.16
[hook] useQuery  (0) 2025.12.12