Skip to content

useBackEvent

지원 종료 예정 (Deprecated)

useBackEvent는 지원 종료 예정이에요. 이후 릴리스에서 제거되니 useBackHandler를 사용하세요.

useBackHandler로 등록한 핸들러는 BackEvent 객체를 받고, true를 반환해서 조건에 따라 뒤로 가기 동작을 가로챌 수 있어요. useBackEvent처럼 등록돼 있는 동안 항상 기본 뒤로 가기를 막으려면 핸들러에서 true를 반환하세요.

tsx
// Before
const backEvent = useBackEvent();

useEffect(() => {
  const listener = () => {
    // 뒤로 가기 동작 처리
  };

  backEvent.addEventListener(listener);

  return () => {
    backEvent.removeEventListener(listener);
  };
}, [backEvent]);

// After
const backHandler = useBackHandler();

useEffect(() => {
  const subscription = backHandler.addEventListener(() => {
    // 뒤로 가기 동작 처리
    return true; // 기본 뒤로 가기 동작을 막아요
  });

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

뒤로 가기 이벤트를 등록하고 제거할 수 있는 컨트롤러 객체를 반환하는 Hook이에요. 이 Hook을 사용하면 특정 컴포넌트가 활성화되었을 때만 뒤로 가기 이벤트를 처리할 수 있어요. addEventListener 를 쓰면 뒤로 가기 이벤트를 등록할 수 있고, removeEventListener 를 쓰면 뒤로 가기 이벤트를 제거할 수 있어요. 사용자가 화면을 보고 있을 때만 등록된 뒤로 가기 이벤트가 등록돼요. 화면을 보고 있다는 조건은 useVisibility 을 사용해요.

이 Hook을 사용해 특정 컴포넌트에서 뒤로 가기 이벤트를 처리하는 로직을 정의할 수 있어요.

시그니처

typescript
function useBackEvent(): BackEventControls;

반환 값

  • BackEventControls

    뒤로 가기 이벤트를 제어할 수 있는 객체예요. 이 객체에는 이벤트를 등록하는 addEventListener 메서드와와 제거하는 removeEventListener 메서드가 포함 되어 있어요.

에러

  • Error

    이 훅이 BackEventProvider 내에서 사용되지 않은 경우 에러를 발생시켜요.

예제

뒤로 가기 이벤트 등록 및 제거 예제

  • "Add BackEvent" 버튼을 누르면 뒤로 가기 이벤트가 등록돼요. 이후 뒤로 가기 버튼을 누르면 "back"이라는 알림이 뜨고, 실제로 뒤로 가지 않아요.
  • "Remove BackEvent" 버튼을 누르면 등록된 이벤트가 제거돼요. 이후 뒤로 가기 버튼을 누르면 기존 동작대로 정상적으로 뒤로 가요.
tsx
import { useEffect, useState } from 'react';
import { Alert, Button, View } from 'react-native';
import { useBackEvent } from '@granite-js/react-native';

export function UseBackEventExample() {
  const backEvent = useBackEvent();

  const [handler, setHandler] = useState<{ callback: () => void } | undefined>(undefined);

  useEffect(() => {
    const callback = handler?.callback;

    if (callback != null) {
      backEvent.addEventListener(callback);

      return () => {
        backEvent.removeEventListener(callback);
      };
    }

    return;
  }, [backEvent, handler]);

  return (
    <View>
      <Button
        title="Add BackEvent"
        onPress={() => {
          setHandler({ callback: () => Alert.alert('back') });
        }}
      />
      <Button
        title="Remove BackEvent"
        onPress={() => {
          setHandler(undefined);
        }}
      />
    </View>
  );
}