useVisibilityEffect
useVisibility를 기준으로 화면이 보이는 동안 효과를 실행해요. 콜백이 반환한 cleanup 함수는 화면이 가려지거나, 콜백이 바뀌거나, 컴포넌트가 unmount될 때 실행돼요.
시그니처
typescript
function useVisibilityEffect(effect: EffectCallback): void;effect는 React의 useEffect와 같은 콜백 타입이에요. 동기 함수이며 cleanup 함수를 반환할 수 있어요. async 콜백을 전달하는 대신 콜백 안에서 비동기 작업을 시작하세요.
실행과 정리
- 처음부터 보이는 화면에서는 렌더가 반영된 후 실행해요. 가려진 상태로 mount되면 실행하지 않아요.
- 화면이 가려지면 실행 중인 효과를 정리하고, 다시 보이면 실행해요.
- 보이는 동안 콜백의 참조가 바뀌면 기존 효과를 정리한 후 새 콜백을 실행해요.
- 가려진 상태를 거치지 않고 바로 unmount돼도 실행 중인 효과를 정리해요.
- 개발 환경의 React Strict Mode에서는 실행과 정리가 추가로 한 번 일어날 수 있어요.
관계없는 리렌더링으로 효과가 다시 시작되지 않도록 필요한 의존성을 지정한 useCallback을 사용하세요.
예제
tsx
import { useCallback } from 'react';
import { BackHandler } from 'react-native';
import { useVisibilityEffect } from '@granite-js/react-native';
function Screen({ onBack }: { onBack: () => boolean }) {
useVisibilityEffect(
useCallback(() => {
const subscription = BackHandler.addEventListener('hardwareBackPress', onBack);
return () => subscription.remove();
}, [onBack])
);
return null;
}다른 가시성 훅과의 차이
- useVisibility는 현재 가시성을 반환해요.
- useVisibilityChange는 deprecated API이며,
'visible','hidden'전환을 알려줘요. 콜백의 반환값을 cleanup으로 등록하지 않아요. useVisibilityEffect는 화면이 보이는 동안 유지할 효과를 실행하고 정리해요.
React Navigation의 useFocusEffect와 달리 useVisibility가 나타내는 네이티브 화면 가시성도 반영해요. 따라서 route의 focus가 유지되더라도 다른 네이티브 화면이 현재 화면을 가리면 정리할 수 있어요. 실행과 정리는 navigation 이벤트 리스너 안에서 동기적으로 이루어지는 대신 React의 effect 실행 시점을 따라요.