• 티스토리 홈
  • 프로필사진
    KIMJAVAN
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
KIMJAVAN
  • 프로필사진
    KIMJAVAN
    • 개발 (160)
      • 마크업 언어 (19)
        • HTML (7)
        • CSS (12)
      • 자바스크립트 (85)
        • JavaScript (34)
        • JS Library (6)
        • React (13)
        • threeJS (6)
        • TypeScript (2)
        • Next js (5)
        • Node JS (18)
        • webGL (1)
      • AI (4)
        • chat-gpt (4)
      • flutter (17)
        • dart (11)
        • flutter (6)
      • Sql (3)
      • PHP (4)
      • Python (2)
      • Git (4)
      • vscode (1)
      • 개발 도움 사이트 (7)
      • 작업기록 (1)
      • 오류 모음 (3)
      • 메모장 (7)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [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일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바