概要: このチュートリアルでは、Todo リストを保存するために、React Todo アプリと API サーバーの統合を続けます。
API サーバーのセットアップ
まず、次のファイルをダウンロードし、todo-api などのコンピューター上のディレクトリに展開します。
次に、ターミナルを開き、プロジェクトディレクトリに移動します。
cd todo-apiCode language: JavaScript (javascript)3番目に、次の npm コマンドを実行して、プロジェクトの依存関係をインストールします。
npm instalCode language: JavaScript (javascript)最後に、npm start コマンドを実行して、API サーバーを起動します。
npm startCode language: JavaScript (javascript)API サーバーが起動し、ポート 5000 でリッスンします。
http://:5000/Code language: JavaScript (javascript)次の表に API エンドポイントを示します。
| メソッド | エンドポイント | 説明 | リクエストボディ | レスポンス |
|---|---|---|---|---|
GET | /todos | すべての Todo 項目を取得します。 | なし | Todo の JSON 配列 |
GET | /todos/:id | ID で単一の Todo 項目を取得します。 | なし | Todo 項目の JSON オブジェクト |
POST | /todos | 新しい Todo 項目を作成します。 | { "title": string, "completed": integer } | 作成された Todo 項目の JSON オブジェクト |
PUT | /todos/:id | ID で既存の Todo 項目を更新します。 | { "title": string, "completed": boolean } | 更新された Todo 項目の JSON オブジェクト |
DELETE | /todos/:id | ID で Todo 項目を削除します。 | なし | { "id": integer } |
API を React Todo アプリに統合する
React から API を呼び出すには、Web ブラウザーが提供する組み込みの Fetch API を使用できます。
Todo リストの表示
Todo アプリが初めて起動するときは、API を呼び出して、すべての Todo 項目を取得し、画面に表示する必要があります。GET /todos
そのためには、次の操作が必要です。
- API
を呼び出してすべての Todo 項目を取得し、GET/todostodos状態を更新する関数getTodosを定義します。 - アプリが起動した最初の 1 回だけ、
getTodos関数を実行します。
まず、API を呼び出して todos 状態を更新する新しい関数 getTodos() を定義します。
const getTodos = async () => {
const url = 'https://:5000/todos';
try {
const response = await fetch(url, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
});
if (!response.ok) {
throw new Error('Network response was not ok');
}
const storedTodos = await response.json();
// Update the state
if (storedTodos) setTodos(storedTodos);
} catch (error) {
console.error('Error during GET request:', error);
}
};Code language: JavaScript (javascript)次に、コンポーネントが最初にレンダリングされたときに useEffect() フックを使用して getTodos() 関数を 1 回呼び出します。
useEffect(() => {
getTodos();
}, []);Code language: JavaScript (javascript)この構文では、useEffect は React のフックです。フックは、コンポーネントに機能を追加する関数です。
useEffect() フックを使用すると、特定の時点で関数を実行できます。2 つの引数を受け取ります。
- 関数
- 空の配列 (
[])。
空の配列は、コンポーネントが最初にレンダリングされたときに関数を実行するように フックに指示します。React フックについては、今後のチュートリアルで詳しく説明します。useEffect()
新しい Todo 項目の作成
新しい Todo 項目を作成するには、次の操作が必要です。
- API
POST /todosを呼び出して、データベースに新しい Todo 項目を作成します。 setTodos関数を使用して、新しい Todo を現在の Todos 状態に追加します。
createTodo() 関数の変更バージョンを次に示します。
const createTodo = async (title) => {
// form a new todo
const newTodo = {
title: title,
completed: false,
};
// call an API to create a new todo
const url = 'https://:5000/todos';
try {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(newTodo),
});
if (!response.ok) throw new Error('Network response was not ok');
const storedTodo = await response.json();
// set a new state
const updatedTodos = [...todos, storedTodo];
setTodos(updatedTodos);
} catch (error) {
console.error('Error creating a todo:', error);
}
};Code language: JavaScript (javascript)Todo 項目の削除
Todo 項目を削除するには、次の操作が必要です。
- API
DELETE /todo/:idを呼び出して、データベースから ID で指定された Todo を削除します。 - 削除された Todo を
todos状態から削除します。
removeTodo() 関数の新しいバージョンを次に示します。
const removeTodo = async (id) => {
// Delete the todo
const url = `https://:5000/todos/${id}`;
try {
const response = await fetch(url, {
method: 'DELETE',
headers: {
'Content-Type': 'application/json',
},
});
if (!response.ok) throw new Error('Network response was not ok');
// Update the state
const updatedTodos = todos.filter((todo) => todo.id !== id);
setTodos(updatedTodos);
} catch (error) {
console.error('Error during DELETE request:', error);
throw error;
}
};Code language: JavaScript (javascript)Todo 項目の更新
Todo 項目を更新するには、次の操作が必要です。
- API
PUT /todo/:idを呼び出して、ID で指定された Todo を更新します。 - 変更された Todo を
todos状態に更新します。
changeTodo() 関数の新しいバージョンを次に示します。
const changeTodo = async (id, newTitle, completed = false) => {
// Update todo
const url = `https://:5000/todos/${id}`;
const data = { title: newTitle, completed };
try {
const response = await fetch(url, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
});
if (!response.ok) {
throw new Error('Network response was not ok');
}
const updatedTodo = await response.json();
// Update the state
const updatedTodos = todos.map((todo) => {
if (todo.id === id) {
return { ...todo, ...updatedTodo };
}
return todo;
});
setTodos(updatedTodos);
} catch (error) {
console.error('Error during PUT request:', error);
throw error;
}
};Code language: JavaScript (javascript)Todo アプリの残りの部分は変わりません。
API を使用した React Todo アプリをダウンロード
API を使用した React Todo アプリのソースコードをダウンロード
概要
- Web ブラウザーが提供する Fetch API を使用して API を呼び出します。
- コンポーネントが表示された後に関数を 1 回実行するには、
useEffectフックを使用します。