개발자

next.js 특정 페이지에 컴포넌트 미출력 기능 구현 이슈(use client 사용)

2023년 09월 10일조회 376

로그인페이지(/user-page)에서 footer컴포넌트를 안띄우는 기능을 구현하고 싶어 footer 컴포넌트를 csr 방식으로 사용하도록 'use client' 줬습니다. 근데 error ReferenceError: window is not defined 라는 에러가 뜨면서 적용이 안되네요ㅠㅠ nextjs는 ssr이니까 window에 접근하기 위해선 'use client'를 주면 된다고 들었는데 왜 안되는걸까요?? 찾아보니까 useEffect 쓰라해서 useEffect도 써봤는데 에러가 뜨진않지만 여전히 적용안되더라구요. 문제점 알려주시면 감사하겠습니다ㅠㅠㅠ <footer.tsx 파일> 'use client' import React, { useEffect } from 'react' import style from '../styles/footer.module.scss' const Footer = () => {     if (window.location.pathname === '/user-page') return null return ( -생략- ) } <루트 layout.tsx 파일> 'use client' export default function RootLayout({     children, }: {     children: React.ReactNode }) {   return (         <html lang="ko">             <body className={inter.className}>                 <div className="wrap bg-white">                     <Header />                     {children}                     <Footer />               </div>             </body>         </html>     ) }

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 3

아발란체님의 프로필 사진

footer가 필요한 도메인들의 그룹 최상위 레이아웃에 Footer 컴포넌트를 넣고 로그인페이지 레이아웃에는 안넣으면 되지않을까요?? Rootlayout에는 Footer를 넣지말구영 참고로 Rootlayout 파일은 왠만하면 서버컴포넌트를 유지하는것을 추천드립니다.

털먹는토끼님의 프로필 사진

털먹는토끼

작성자

미스터블루 프론트엔드 개발자2023년 09월 10일

근데 로그인페이지말곤 모든 도메인에서 footer 컴포넌트를 사용해서요... 이거 하나때문에 프로젝트 최상위 Rootlayout을 사용하지않고 로그인페이지그룹(사실 페이지하나..)의 layout, footer컴포넌트를 사용하는 나머지 모든 페이지그룹의 layout 이렇게 나눠서 운영하는것이 과연 효율적인가 싶기도해서 다른 방법이 없나 물색중이었습니다. 아무쪼록 답변 정말 감사합니다!!

최진님의 프로필 사진

okky에도 동일한 질문 올리셨던데 답변드렸습니다.

Ed님의 프로필 사진

usePathname 훅 사용하시면 됩니다. https://nextjs.org/docs/app/api-reference/functions/use-pathname 해당 오류가 발생하는 이유는 랜더링 시점과 관련이 있을거 같은데 함수의 선언시점에는 브라우저의 window 객체에 참조가 불가능해서 일겁니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2023년 09월 10일

`window` 객체는 브라우저 환경에서만 사용 가능한 객체입니다. Next.js의 SSR(Server Side Rendering) 특성 상 서버에서 렌더링을 진행할 때는 브라우저 환경이 아니기 때문에 `window` 객체를 참조하면 에러가 발생합니다. 이를 해결하기 위해 useEffect 내부 혹은 컴포넌트가 Mount된 이후(`useEffect`, `componentDidMount` 등)에 window 객체에 접근하는 로직을 구현합니다. 하지만 질문 내용을 보니 결과적으로는 '/user-page'에서 footer 컴포넌트를 숨기고 싶다는 문제를 해결하려고 합니다. 그렇다면 해당 페이지(/user-page)에서 footer 컴포넌트를 포함하지 않도록 구현하는 것이 적합할 수 있습니다. 예를 들어, 최상위(Root) layout에 Footer 컴포넌트가 포함되어 있는 경우 "/user-page"와 같은 특정 페이지에서 Footer 컴포넌트가 보이지 않게 하려면 해당 페이지 자체의 레이아웃을 변경하는 방식으로 접근할 수 있습니다. 자세한 코드 작성법은 의존성 및 전체 프로젝트의 구조에 따라 달라질 수 있으므로, 이점 참고 부탁드립니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!