next.js : 데이터 변경 및 삭제

728x90
반응형

데이터 변경 (클라이언트 컴포넌트) 

1) create 하는 화면(클라이언트 컴포넌트)   

2) read 하는 화면(서버 컴포넌트)

1. page.js 파일 생성 (변경)

> update폴더 > [id]폴더 > page.js 파일을 만들어줌

 

2. page.js 코드 구현 (변경)

(1) create 하는 화면 코드 가져오기

(2) read 하는 화면(서버 컴포넌트) --> read하는 부분을 useEffect로 가져와야함

 

update > [id] > page.js

'use client';

import { useParams, useRouter } from 'next/navigation'; // 넥스트 13버전 (app router)
import { useEffect, useState } from 'react';

export default function Update() {
    const [title, setTitle] = useState('');
    const [body, setBody] = useState('');

    const router = useRouter();
    const params = useParams();
    const id = params.id;
    useEffect(() => {
        fetch(`http://localhost:9999/topics/${id}`)
            .then((resp) => resp.json())
            .then((result) => {
                setTitle(result.title);
                setBody(result.body);
            });
    }, []);
    return (
        <form
            onSubmit={(event) => {
                event.preventDefault();
                const title = event.target.title.value;
                const body = event.target.body.value;
                const options = {
                    method: 'PATCH',
                    headers: {
                        'Content-Type': 'application/json',
                    },
                    body: JSON.stringify({ title, body }), //json타입으로 전환
                };
                fetch(`http://localhost:9999/topics/` + id, options)
                    .then((res) => res.json())
                    .then((result) => {
                        console.log(result);
                        const lastid = result.id;

                        //리디렉션
                        router.push(`read/${lastid}`);
                        router.refresh();
                    });
            }}
        >
            <p>
                <input
                    type="text"
                    name="title"
                    placeholder="title"
                    value={title}
                    onChange={(e) => setTitle(e.target.value)}
                ></input>
            </p>
            <p>
                <textarea
                    name="body"
                    placeholder="body"
                    value={body}
                    onChange={(e) => setBody(e.target.value)}
                ></textarea>
            </p>
            <p>
                <input type="submit" value="update"></input>
            </p>
        </form>
    );
}

1) useParam 을 사용해서 id 가져오기 

2) useEffect를 사용 => fetch 로 데이터 가져옴 (resp) 

3) useState를 사용 => 데이터 넣기

4) input에 value값과 onChange 이벤트 설정

5) 버튼 클릭시 form 이벤트에서 메서드는 데이터 변경이니 PATCH 로 변경

6) fetch 할때  경로에 id 값 추가해서 가져오기

 

[조회 화면]

read > [id] > pages.js

  const response = await fetch(`http://localhost:9999/topics/${props.params.id}`, { cache: 'no-store' });

> 캐시 옵션 꺼주기 

 

3. 데이터 삭제 

[Control.js]

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

export function Control() {
    const params = useParams();
    const router = useRouter();
    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"
                            onClick={() => {
                                fetch(`http://localhost:9999/topics/` + id)
                                    .then((res) => res.json())
                                    .then((result) => {
                                        router.push('/');
                                        router.refresh();
                                    });
                            }}
                        ></input>
                    </li>
                </>
            ) : null}
        </ul>
    );
}

1) onClick 이벤트 생성 

2) fetch에 url에 id 값 추가해서 들어감

3) 삭제된 후 데이터 없으니 홈화면으로 이동 (router필요 )=> router.push

4) 리프레쉬해주기

 

끝.

 

[출처] 생활코딩

 

데이터 변경 및 삭제

반응형