[에러해결]Uncaught TypeError: Cannot destructure property 'future' of 'react__WEBPACK_IMPORTED_MODULE_0__.useContext(...)' as it is null.

정혜인·2024년 1월 24일
0

react

목록 보기
10/14
post-thumbnail

typescript + react를 사용하던 도중, 중복되는 코드를 여러번 쓰지 않기 위해서 최적화를 하려다 발생하였다.

Header.tsx 컴포넌트 파일에

//Header.tsx
      <NavLink to={`${process.env.PUBLIC_URL}/`}>
        <img
          className="header-logo"
          src={process.env.PUBLIC_URL + "/assets/images/header-logo.svg"}
        />
      </NavLink>

이렇게 코드를 작성했는데, NavLink 때문에 자꾸

Uncaught TypeError: Cannot destructure property 'future' of 'react__WEBPACK_IMPORTED_MODULE_0__.useContext(...)' as it is null.

위와 같은 에러가 뜨는 것을 확인할 수 있었다.

프로젝트 초기 세팅 단계였기에 react-router-dom 삭제 후 재설치 등 기초적인 부분부터 잘못된 부분을 찾아나갔고,
컴포넌트가 아닌 페이지에서는 NavLink가 잘 작동하는 것을 확인할 수 있었다.

즉, 컴포넌트에서만 동작하지 않는 것이었다.

router와 관련된 문제일 것이라고 예상하고, DOM에서 상단에 위치한 App.tsx부터 살펴보았다.

//App.tsx
function App() {
  return (
    <>
      <RecoilRoot>
        <Layout>
          <Router></Router>
        </Layout>
      </RecoilRoot>
    </>
  );
}

저 Layout 컴포넌트 내에 Header가 있는데, 이 컴포넌트가 라우터 밖에 위치해서 발생하는 문제였다.

그래서 아래처럼 App.tsx에서가 아닌 Header가 사용되는 페이지에서 각각 호출해주었더니, 잘 해결되는 것을 볼 수 있었다.

//App.tsx
function App() {
  return (
    <>
      <RecoilRoot>
        <Router></Router>
      </RecoilRoot>
    </>
  );
}
//Home.tsx
.....
return (
    <Layout>
      <section>....</section>
    </Layout>
  )

vue + typescript에서는 같은 코드를 반복하지 않기 위해서 이런 식으로 작성했었는데, (물론 구조가 조금 다르겠지만...) 현재 진행하는 프로젝트에서는 불가능하다는 것을 확인했다...
그렇다면 중복된 코드를 매 페이지마다 작성해주어야 하는 것인데, 이 방법이 과연 최선일까?
이 부분은 조금 더 공부해보아야 할 것 같다.

0개의 댓글