- [next] metadata 와 use client 충돌2024년 12월 20일
- KIMJAVAN
- 작성자
- 2024.12.20.:10
728x90[오류상황]
metadata도 정의하고 싶고 use client 써서 useState 도 쓰고싶은 상황.
둘 다 같이 사용하니까 오류 발생함 (page.tsx에서 발생)
// "use client"; // import { useState } from "react"; export const metadata = { title: 'Next.js hihi ;)', } export default function Tomato() { // const [count, setCount] = useState(0); return ( <main> <h1>main page</h1> {/* <button onClick={() => setCount(count + 1)}>Click me: {count}</button> */} </main> ); }
위와같이 metadata 쓸거면 useState를 주석하고 useState를 쓸거면 metadata를 주석해야 작동된다 (하나에 같이 못씀)
[해결방법]
// app/tomato/page.tsx export const metadata = { title: 'Next.js hihi ;)', }; import TomatoClient from "./tomato-client"; // 클라이언트 컴포넌트 불러오기 export default function TomatoPage() { return ( <main> <TomatoClient /> {/* 클라이언트 컴포넌트 렌더링 */} </main> ); }
// app/tomato/tomato-client.tsx "use client"; import { useState } from "react"; export default function TomatoClient() { const [count, setCount] = useState(0); return ( <> <h1>main page</h1> <button onClick={() => setCount(count + 1)}> Click me: {count} </button> </> ); }
- page.tsx는 서버 컴포넌트이므로 metadata를 정의할 수 있다.
- TomatoClient는 클라이언트 컴포넌트로, useState와 같은 클라이언트 기능을 사용할 수 있다.
- 서버 컴포넌트에서 클라이언트 컴포넌트를 렌더링하면, 두 기능을 모두 사용할 수 있다.
Next.js에서는 metadata는 서버 컴포넌트에서만 정의할 수 있습니다. 따라서 클라이언트 기능을 사용해야 한다면:
- metadata를 서버 컴포넌트에 정의하고
- 클라이언트 로직은 별도의 클라이언트 컴포넌트에 작성하면 된다.
이 방식은 SEO 최적화와 클라이언트 상태 관리를 모두 해결할 수 있는 Next.js의 표준 방법이다.
'자바스크립트 > Next js' 카테고리의 다른 글
[Next] 동적 라우트 / dynamic routes + TS 예시 (0) 2024.12.20 [next js] metadata 레이아웃사용 (0) 2024.12.20 [next js] 오류 / 클라이언트 컴포넌트 (0) 2024.12.19 [Next.js] 사용하는 이유 (2) 2024.11.28 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)