Next.js 14でTodoアプリを作る – 9.データ削除
投稿日:2024年03月18日
更新日:2024年03月18日
データ削除
APIに接続してデータを新規作成します。
ファイルapi.ts
に関数deleteTodo
を作成します。
export async function deleteTodo(id: number) {
const res = await fetch(
`https://todo-app-d1-base.pages.dev/api/todos/${id}`,
{
method: "DELETE",
}
);
if (!res.ok) {
throw new Error("Failed to delete data");
}
return res.json<Todo[]>();
}
TodosTableコンポーネントに削除ボタンを追加
TodosTable
コンポーネントに削除ボタンを追加します。
削除ボタンを配置する列を追加します。
まずは<thead>
に<th>
を追加します。
<thead className="border-b-2 border-black/60">
<tr>
<th className="w-1/4 border-r-2 border-black/60">タイトル</th>
- <th className="w-3/4 border-r-2 border-black/60">内容</th>
+ <th className="w-2/4 border-r-2 border-black/60">内容</th>
+ <th className="w-1/4">-</th>
</tr>
</thead>
また<tbody>
に<td>
を追加します。
削除ボタンが押された時にtodo.id
が取得できるかコンソールで確認します。
<tbody>
{todos.map((todo) => (
<tr className="border-b border-black" key={todo.id}>
<td className="w-1/4 border-r-2 border-black/60">{todo.title}</td>
- <td className="w-3/4 border-r-2 border-black/60">
+ <td className="w-2/4 border-r-2 border-black/60">
{todo.content}
</td>
+ <td className="w-1/4">
+ <button
+ className="bg-red-500 text-white text-sm rounded-lg p-1"
+ onClick={() => {
+ console.log(todo.id);
+ }}
+ >
+ 削除
+ </button
+ </td>
</tr>
))}
</tbody>
todo.id
が取得できるか確認できたら、deleteTodo
関数を呼び出します。deleteTodo
関数にtodo.id
を引数として渡します。
またtodo.id
がundefined
ないことをif文で確認します。useRouter
のインスタンスをrouter
として宣言します。
削除した後にページを更新するためにrouter.refresh()
も追加します。
<tbody>
{todos.map((todo) => (
<tr className="border-b border-black" key={todo.id}>
<td className="w-1/4 border-r-2 border-black/60">{todo.title}</td>
<td className="w-2/4 border-r-2 border-black/60">{todo.content}</td>
<td className="w-1/4">
<button
className="bg-red-500 text-white text-sm rounded-lg p-1"
onClick={() => {
- console.log(todo.id);
+ if (todo.id !== undefined) {
+ deleteTodo(todo.id);
+ }
+ router.refresh();
}}
>
削除
</button>
</td>
</tr>
))}
</tbody>