Next.jsでTodoアプリの作り方.
- Published on
- Authors
-
- Author
- Masaki Hayashi
- twitter @mh_poteto
-
この記事では、React、Typescript、そしてNext.jsを使用して、Todoアプリを作成する方法について解説します。
はじめに
Todoアプリは、日々のタスクを管理するために便利なツールです。この記事では、Next.jsを使用してTodoアプリを作成する手順を紹介します。
プロジェクトのセットアップ
まずは、プロジェクトをセットアップしましょう。以下のコマンドを実行して、新しいNext.jsプロジェクトを作成します。
npx create-next-app todo-app
次に、必要なパッケージをインストールします。
cd todo-app
npm install react react-dom next typescript
TodoアプリのUIコンポーネントを作成する
TodoアプリのUIコンポーネントを作成する前に、必要なファイルを作成しましょう。
- components
- TodoItem.tsx
- TodoList.tsx
- TodoForm.tsx
- pages
- index.tsx
TodoItem
は、Todoアイテムを表示するためのコンポーネントです。TodoList
は、Todoアイテムのリストを表示するためのコンポーネントです。TodoForm
は、新しいTodoアイテムを追加するためのフォームを表示するためのコンポーネントです。indexは、アプリのホームページとして機能します。
まずは、TodoItemコンポーネントを作成しましょう。
import React from "react";
type TodoItemProps = {
id: string;
text: string;
completed: boolean;
onComplete: (id: string) => void;
onDelete: (id: string) => void;
};
export const TodoItem: React.FC<TodoItemProps> = ({
id,
text,
completed,
onComplete,
onDelete,
}) => {
const handleComplete = () => {
onComplete(id);
};
const handleDelete = () => {
onDelete(id);
};
return (
<div>
<input type="checkbox" checked={completed} onChange={handleComplete} />
<span>{text}</span>
<button onClick={handleDelete}>Delete</button>
</div>
);
};
TodoItem
コンポーネントは、Todoアイテムを表示するために必要な要素を描画します。onComplete
プロパティとonDelete
プロパティを使用して、完了したTodoアイテムをマークすることや、Todoアイテムを削除することができます。
次に、TodoListコンポーネントを作成しましょう。
import React from "react";
import { TodoItem } from "./TodoItem";
type TodoListProps = {
items: {
id: string;
text: string;
completed: boolean;
}[];
onComplete: (id: string) => void;
onDelete: (id: string) => void;
};
export const TodoList: React.FC<TodoListProps> = ({
items,
onComplete,
onDelete,
}) => {
return (
<div>
{items.map((item) => (
<TodoItem
key={item.id}
id={item.id}
text={item.text}
completed={item.completed}
onComplete={onComplete}
onDelete={onDelete}
/>
))}
</div>
);
};
TodoList
コンポーネントは、Todoアイテムのリストを表示するために必要な要素を描画します。items
プロパティを使用して、表示するTodoアイテムのリストを受け取ります。onComplete
プロパティとonDelete
プロパティを使用して、完了したTodoアイテムをマークすることや、Todoアイテムを削除することができます。
最後に、TodoForm
コンポーネントを作成しましょう。
import React, { useState } from "react";
type TodoFormProps = {
onSubmit: (text: string) => void;
};
export const TodoForm: React.FC<TodoFormProps> = ({ onSubmit }) => {
const [text, setText] = useState("");
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
onSubmit(text);
setText("");
};
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
setText(event.target.value);
};
return (
<form onSubmit={handleSubmit}>
<input type="text" value={text} onChange={handleChange} />
<button type="submit">Add</button>
</form>
);
};
TodoForm
コンポーネントは、新しいTodoアイテムを追加するために必要なフォームを描画します。onSubmit
プロパティを使用して、新しいTodoアイテムを追加することができます。
データの管理
Todoアプリで管理するデータは、以下のような形式で表現されます。
type TodoItem = {
id: string;
text: string;
completed: boolean;
};
type TodoList = TodoItem[];
このデータを管理するために、useState
フックを使用しましょう。
import React, { useState } from "react";
import { TodoList } from "../components/TodoList";
import { TodoForm } from "../components/TodoForm";
type HomeProps = {};
type TodoItem = {
id: string;
text: string;
completed: boolean;
};
type TodoList = TodoItem[];
const Home: React.FC<HomeProps> = () => {
const [todos, setTodos] = useState<TodoList>([]);
const handleAddTodo = (text: string) => {
const newTodo: TodoItem = {
id: Math.random().toString(36).substring(7),
text: text,
completed: false,
};
setTodos([...todos, newTodo]);
};
const handleCompleteTodo = (id: string) => {
const updatedTodos = todos.map((todo) => {
if (todo.id === id) {
return { ...todo, completed: !todo.completed };
} else {
return todo;
}
});
setTodos(updatedTodos);
};
const handleDeleteTodo = (id: string) => {
const updatedTodos = todos.filter((todo) => todo.id !== id);
setTodos(updatedTodos);
};
return (
<div>
<h1>Todo App</h1>
<TodoList
items={todos}
onComplete={handleCompleteTodo}
onDelete={handleDeleteTodo}
/>
<TodoForm onSubmit={handleAddTodo} />
</div>
);
};
export default Home;
useState
フックを使用して、初期値として空のTodoリストを設定しています。handleAddTodo
関数を使用して、新しいTodoアイテムを追加します。新しいTodoアイテムを作成し、setTodos
関数を使用してTodoリストに追加します。handleCompleteTodo
関数とhandleDeleteTodo
関数を使用して、Todoアイテムを完了したり、削除したりします。
これでTodoアプリが完成しました!次はアプリをビルドして、ブラウザで実行してみましょう。
まとめ
今回は、Next.jsを使用してTodoアプリを作成する方法について学びました。React、TypeScript、Next.jsを使用して、TodoアプリのUIコンポーネントを作成し、データを管理しました。Next.jsを使用することで、SSRや静的サイト生成などの機能を利用することができ、高速でSEOに優れたアプリを開発することができます。これを参考にして、自分なりのTodoアプリを作成してみてください!
最後に
最後までご覧いただきありがとうございました。ところでこの記事の違和感にお気づきの方はいましたでしょうか。
そうです。この記事は「まとめ」の項目までChatGPTが書いたものです。内容の精査など細かいところの修正はありますが、ほとんどはChatGPTからのアンサーをそのまま貼り付けています。
アプリのビルド、動作確認でも問題がなく、ここまで質の高い記事を生成できるのは驚きですね。 ChatGPTの台頭で今までに無い世界が見られそうで楽しみです。
今回の記事生成に使用しましたプロンプトを以下に記載します。ご参考までに。
次で与えられたテーマ、技術、目次で記事を書いてください。
フォーマットはマークダウンで記載してください。
テーマ
- Next.jsでTodoアプリの作り方
技術
- React
- Typescript
- Next.js
目次
- はじめに
- プロジェクトのセットアップ
- TodoアプリのUIコンポーネントを作成する
- データの管理
- Todoアイテムの追加
- Todoアイテムの完了処理
- Todoアイテムの削除
- まとめ