태그
목차

윈도우 포커스 refetching

생성일: 2024-03-22

수정일: 2024-03-22

사용자가 애플리케이션을 떠났다가 돌아왔을 때 쿼리 데이터가 오래된 경우, TanStack Query는 백그라운드에서 자동으로 새로운 데이터를 요청한다. 이 기능은 refetchOnWindowFocus 옵션을 사용하여 전역적으로 또는 쿼리별로 비활성화할 수 있다.

전역 비활성화

//
const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      refetchOnWindowFocus: false, // default: true
    },
  },
});

function App() {
  return <QueryClientProvider client={queryClient}>...</QueryClientProvider>;
}

쿼리별로 비활성화

useQuery({
  queryKey: ['todos'],
  queryFn: fetchTodos,
  refetchOnWindowFocus: false,
});

커스텀 윈도우 포커스 이벤트

드문 경우지만, TanStack Query가 데이터를 재검증하도록 트리거하는 자체 윈도우 포커스 이벤트가 필요할 수도 있다. 이를 위해 TanStack Query는 윈도우가 포커싱될 때 실행할 콜백을 사용자가 직접 설정할 수 있도록 하는 focusManager.setEventListener 함수를 제공한다. focusManager.setEventListener 를 호출하면 이전에 설정된 핸들러가 제거되고 대신 새 핸들러가 사용된다.

예를 들어 기본 핸들러는 다음과 같다:

focusManager.setEventListener((handleFocus) => {
  // Listen to visibilitychange
  if (typeof window !== 'undefined' && window.addEventListener) {
    window.addEventListener('visibilitychange', () => handleFocus(), false);
    return () => {
      // Be sure to unsubscribe if a new handler is set
      window.removeEventListener('visibilitychange', () => handleFocus());
    };
  }
});

React Native에서 포커스 관리하기

window 이벤트 리스너 대신 React Native는 AppState 모듈을 통해 포커스 정보를 제공한다. AppState 상태가 "active" 로 변경될 때 AppState "change" 이벤트를 사용하여 업데이트를 트리거할 수 있다:

import { AppState } from 'react-native';
import { focusManager } from '@tanstack/react-query';

function onAppStateChange(status: AppStateStatus) {
  if (Platform.OS !== 'web') {
    focusManager.setFocused(status === 'active');
  }
}

useEffect(() => {
  const subscription = AppState.addEventListener('change', onAppStateChange);

  return () => subscription.remove();
}, []);

포커스 상태 관리

import { focusManager } from '@tanstack/react-query';

// 기본 포커스 상태 오버라이드
focusManager.setFocused(true);

// 기본 포커스 상태로 돌아가기
focusManager.setFocused(undefined);