생성 기능을 구현하기 위해서는 onSubmit과 같은 사용자와 상호작용하는 코드가 필요합니다. 이런 코드는 서버 쪽에서 실행할 수 없기 때문에 클라이언트 쪽으로 전송되어서 실행되야 합니다. 여기서는 클라이언트 컴포넌트를 만드는 방법을 살펴봅니다.
create/page.js를 수정해보겠습니다.
<p>
<input type="text" name="title" placeholder="title" />
</p>
<p>
<textarea name="body" placeholder="body"></textarea>
</p>
<p>
<input type="submit" value="create" />
</p>
onSubmit={(e) => {
e.preventDefault();
const title = e.target.title.value;
const body = e.target.body.value;
e.preventDefault() : onSubmit실행 됐을 때의 기본적인 동작을 방지합니다. ( 주소가 안바뀜)const title = e.target.title.value : name이 title인 값을 title에 저장합니다.const options = {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ title, body }),
};
fetch(`http://localhost:9999/topics`, options)
.then((res) => res.json())
.then((result) => {
console.log(result);
const lastid = result.id;
router.refresh();
router.push(`/read/${lastid}`);
});
}}
const lastid = result.id; : 서버로부터 받은 결과에서 마지막 생성된 아이디를 가져옵니다.router.refresh(); : 현재 페이지를 다시 로드하고 새로고침하는 역할을 합니다.router.push(`/read/${lastid}`); : 라우터를 사용하여 새로 생성된 아이템을 읽기 페이지로 이동합니다.전체 코드입니다.
"use client";
import { useRouter } from "next/navigation";
export default function Create() {
const router = useRouter();
return (
<form
onSubmit={(e) => {
e.preventDefault();
const title = e.target.title.value;
const body = e.target.body.value;
const options = {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ title, body }),
};
fetch(`http://localhost:9999/topics`, options)
.then((res) => res.json())
.then((result) => {
console.log(result);
const lastid = result.id;
router.refresh();
router.push(`/read/${lastid}`);
});
}}
>
<p>
<input type="text" name="title" placeholder="title" />
</p>
<p>
<textarea name="body" placeholder="body"></textarea>
</p>
<p>
<input type="submit" value="create" />
</p>
</form>
);
}
const router = useRouter(); : useRouter를 사용하면 라우터 객체를 생성할 수 있습니다. useRouter는 client component에서만 사용 가능합니다.