Error: useLocation() may be used only in the context of a component.


Error code

Error: useLocation() may be used only in the context of a component.

Cause

위 에러는 원래 React에서 useLocation을 Router 컴포넌트에 넣지 않고 사용해서 발생하는 에러다. 하지만 나는 React-Native에서 사용하지도 않았는데 위 에러가 발생했다. 원인이 뭔지 찾아보니 useSearchParams라는 컴포넌트를 불러서 사용하는 것이 문제였다. 이 컴포넌트는 “react-router-native”에서 불러오는 컴포넌트인데 useSearchParams는 React Router에서 제공하는 훅으로, URL의 쿼리 파라미터를 쉽게 다루기 위해 사용된다. 이 훅을 사용하면 URL의 쿼리 문자열을 읽거나 수정할 수 있으며, 나는 아래와 같이 사용했다.

  // state: Query Parameter 상태 //
  const [queryParam] = useSearchParams();
  const snsId = queryParam.get('snsId');
  const joinPath = queryParam.get('joinPath');

SNS로그인 구현 코드에서 에러가 발생했는데 “react-router-native”와 “@react-navigation/native”을 둘 다 사용해서 발생하는 오류라고 한다.

import { useNavigation } from '@react-navigation/native';
import { NativeRouter, useNavigate, useSearchParams } from 'react-router-native';

어쩌다보니 useNavigation과 useNavigate를 둘 다 쓰게 됐는데 충돌이 일어난 듯 하다.

Solution

오류 해결을 위해서 “react-router-native”을 제거하고 “@react-navigation/native”에서 useSearchParams를 대체하는 컴포넌트를 썼다.

Existing Code

import { useNavigation } from '@react-navigation/native';
import { NativeRouter, useNavigate, useSearchParams } from 'react-router-native';

// state: Query Parameter 상태 //  
const [queryParam] = useSearchParams();  
const snsId = queryParam.get('snsId');  
const joinPath = queryParam.get('joinPath');

Modified Code

import { useNavigation,  useRoute } from '@react-navigation/native';

// Query Parameter 타입 정의
interface RouteParams {
  snsId?: string;
  joinPath?: string;
}

// route: 현재 라우트 정보를 가져옴
const route = useRoute();
const { snsId, joinPath } = route.params as RouteParams; // URL 파라미터

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.