next.js : 서버 컴포넌트에서 클라이언트 컴포넌트 분리

728x90
반응형

update하기 위해서는 해당 id를 알아야함

=> useParams 를 사용해야함 (client 컴포넌트 훅임) --> 서버 컴포넌트에서는 사용 불가능

=> 클라이언트 컴포넌트로 변경할 수 있지만, 그렇게 되면 서버 컴포넌트의 장점을 잃어버림 

(가능한 서버 컴포넌트 위주로 사용하기!)

==>  특정 부분만 클라이언트 컴포넌트화 시키기!

 

 [layout.js]

(변경 전)

        <ul>
            <li>
                <a href="/create">Create</a>
            </li>
            <li>
                <a href="/update/1">Update</a>
            </li>
            <li>
                <input type="button" value="delete"></input>
            </li>
        </ul>

 

(변경 후)

function Control() {
    return (
        <ul>
            <li>
                <a href="/create">Create</a>
            </li>
            <li>
                <a href="/update/1">Update</a>
            </li>
            <li>
                <input type="button" value="delete"></input>
            </li>
        </ul>
    );
}

export default async function RootLayout({ children }) {
<body>
                 {children}
                 <Control />
</body>

▶ 컴포넌트화 시키기 

 

 [layout.js]

import { Control } from './Control';

 

 [Control.js]

'use client';
import Link from 'next/link';
import { useParams } from 'next/navigation';

export function Control() {
    const params = useParams();
    const id = params.id;
    return (
        <ul>
            <li>
                <Link href="/create">Create</Link>
            </li>
            {id ? (
                <>
                    <li>
                        <Link href={'/update/' + id}>Update</Link>
                    </li>
                    <li>
                        <input type="button" value="delete"></input>
                    </li>
                </>
            ) : null}
        </ul>
    );
}

1) 상단에 'use client'를 사용해서 클라이언트 컴포넌트로 사용

2) useParam을 사용해서 해당 id값 가져오기 (params.id)

3) id값이 있으면 update& 버튼 보여주고 없으면 아무것도 안 보여주기

4) update도 링크 부분에 {'/update/+id'} => 업데이트 클릭시 url 변경 완료

> 홈버튼에서는 create 만보임

> 4. reactnext.js : 서버 컴포넌트에서 클라이언트 컴포넌트 분리클릭해서 들어가면 update + delete 버튼 보임

 

 

끝.

반응형