レザボア・コンサルティングの中西です。
本記事では、React + TypeScript でシンプルな TODO アプリを実装する手順を紹介します。
React とは
React は Facebook によって開発された、ユーザーインターフェースを構築するための JavaScript ライブラリです。
(参考) react.dev
React は コンポーネントベースのアプローチを採用しており、再利用可能なUI部品を作成できます。そのため、動的なウェブアプリケーションのフロントエンド開発に多く用いられています。
TypeScript とは
TypeScript は Microsoft の Anders Hejlsberg 氏によって設計された JavaScript のスーパーセットで、大規模アプリケーションの開発に適しています。
JavaScript に静的型付けとクラスベースオブジェクト指向を導入することで、コードの品質と効率を向上させ、大規模なプロジェクトでの開発を容易にします。
(参考)TypeScript
開発環境情報
- macOS(13.5.1)
- Node.js(v21.3.0)
エディタは Visual Studio Code を利用しています。
手順1. React のセットアップ
任意のディレクトリで、以下のコマンドを実行します。
npx create-react-app my-todo-app --template typescript
このコマンドにより、TypeScript を用いた React アプリケーションの雛形が作成されます。
このまま開発に移っても良いのですが、せっかくなので見た目は Material UI で整えながら進めたいと思います。
Material UI とは、 Google のマテリアルデザインの仕様を用いた React のUI コンポーネントライブラリです。
洗練されたデザインを素早く実現することができるため、フロントエンド開発のデザイン時に重宝します。
以下のコマンドで Material UI をインストールします。
cd my-todo-app
npm install @mui/material @emotion/react @emotion/styled
この時点で、以下のようなディレクトリ構造になっています。
package.json の dependencies は以下の通りです。
"dependencies": {
"@emotion/react": "^11.11.3",
"@emotion/styled": "^11.11.0",
"@mui/icons-material": "^5.15.4",
"@mui/material": "^5.15.4",
"@testing-library/jest-dom": "^5.17.0",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"@types/jest": "^27.5.2",
"@types/node": "^16.18.71",
"@types/react": "^18.2.48",
"@types/react-dom": "^18.2.18",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "5.0.1",
"typescript": "^4.9.5",
"web-vitals": "^2.1.4"
}
手順2. 単一の TODO コンポーネントの作成
まずは、TODO 1つを管理するためのコンポーネントを作成します。
src/
├─ App.tsx
├─components
└── TodoItem.tsx
上記のように、 components
ディレクトリを追加し、 TodoItem.tsx
を作成します。
JSX(JavaScript XML)は、Reactで使用される構文拡張です。HTMLのように見えますが、実際にはJavaScriptの表現です。JSXを使うことで、Reactのコンポーネントのレンダリングロジックを視覚的かつ宣言的に記述することができます。
React で TypeScript を用いる場合、 JSX の記述があるファイルの拡張子は .tsx
である必要があります。
TodoItem.tsx
は以下のように記述します。
import React from 'react';
import { Card, CardContent } from '@mui/material';
interface TodoItemProps {
todo: {
id: number;
text: string;
};
}
const TodoItem: React.FC<TodoItemProps> = ({ todo }) => {
return (
<Card>
<CardContent>{todo.text}</CardContent>
</Card>
);
};
export default TodoItem;
TODO は、まずはシンプルに Id と TODO 名だけを持つプロパティを定義します。
Material UI の Card
を用いて見た目を整えます。
手順3. TODO コンポーネントのリストの作成
手順2 では、一つの TODO を管理するコンポーネントを作成しました。
次に、これをリスト表示してみます。
src/
├─ App.tsx
├─components
└── TodoList.tsx
└── TodoItem.tsx
TodoList.tsx
を追加します。
import React, { useState } from 'react';
import TodoItem from './TodoItem';
import { TextField, Button } from '@mui/material';
interface Todo {
id: number;
text: string;
}
const TodoList: React.FC = () => {
const [todos, setTodos] = useState<Todo[]>([]);
const [input, setInput] = useState('');
const addTodo = () => {
setTodos([...todos, { id: Date.now(), text: input }]);
setInput('');
};
return (
<div>
<TextField label="TODOを追加" value={input} onChange={(e) => setInput(e.target.value)} />
<Button onClick={addTodo}>追加</Button>
{todos.map((todo) => (
<TodoItem key={todo.id} todo={todo} />
))}
</div>
);
};
export default TodoList;
先ほど作成した TodoItem を追加できるよう、入力欄とボタンを配置します。
Reactの useState
は、関数コンポーネント内で状態(state)を管理するためのフックです。これにより、状態を持つことができます。
(参考)useState
手順4. TODO リストを表示
ここまでで TODO を表示・管理するためのコンポーネントが作成できました。
App.tsx
を修正し、画面に表示する準備を整えます。
テンプレート作成時点で App.tsx
はすでに存在しているため、内容を上書きします。
import React from 'react';
import TodoList from './components/TodoList';
const App: React.FC = () => {
return (
<div>
<h1>TODO アプリ</h1>
<TodoList />
</div>
);
};
export default App;
手順5. 動作確認
以下のコマンドを実行します。
npm start
アプリケーションが Port 3000 で起動していると思います。
http://localhost:3000/
にアクセスします。
このような画面が表示されれば成功です。
入力欄にタスク名を入力し、「追加」 ボタンを押して、タスクが追加できることも確認してみてください。
おわりに
本記事では、React + TypeScript でシンプルな TODO アプリを実装してみました。
React による実装イメージと、 Material UI によるデザインの良さが伝わったでしょうか。
React は人気のライブラリであるため、ぜひキャッチアップしておきたいですね。