Reactでtodoアプリを作ろう①:環境構築~コンポーネント作成
今回からReactの学習記録をスタートさせたいと思います。
Reactを選んだ理由は、以前作成した「ポモドーロタイマー」を
最終的にReact/Reduxにリプレイスするためです。
そのためには、React自体の理解が必須です。
まずは、簡単なアプリの作成を通して理解を深めていくことにしました。
※そもそも、なぜポモドーロタイマーをReact/Reduxにリプレイスしたいかというと
私が目指している企業の「求める経験」の中にReactが多かったためです。
Reactに合わせて、その周辺知識であるReact/Reduxまで理解しておきたく学習を進めています!
完成品イメージ
今回のアプリの完成イメージです。

タイトルと内容を分けて入力する仕様になっています。
環境構築
早速、環境構築から始めていきます。
今回は最も簡単にReactの開発環境を整えられる
「create-react-app」を用いることにしました。
//react-todoの部分は任意。お好きなプロジェクト名でOK $ create-react-app react-todo $ cd react-todo
ディレクトリ構成
アプリ作成に当たり、まずはディレクトリの構成を決めます。
今回は以下のように設定します。
(※不要なファイルは削除しています。)
. ┗node_modules/ ┗public/ ┗src/ ┗components/ | |- App.jsx | |- Header.jsx | |- Form.jsx | ┗ ToDoList.jsx |-App.css |-index.js ┗ serviceWorker.js .gitignore package.json package-lock.json README.md
srcディレクトリにcomponentsフォルダを作成し
その中にコンポーネントを作成していきます。
Appコンポーネントを親コンポーネントとして
以下3つのコンポーネントを子として配置します。
Headerコンポーネント:タイトルの表示(stateless)
Formコンポーネント:ユーザー入力エリア(stateを管理)
ToDoListコンポーネント:入力したTodoを表示するエリア(stateを管理)
※Appコンポーネントはstateを管理
※今回スタイルにBootstrapを使用しています。
Bootstrapを使用する際は、public>index.htmlの
haed内にリンクを追加してください。
コンポーネントの作成
ディレクトリ構成と各コンポーネントの役割を決めたので、
まずはそれらに沿って、見た目を整えていきます。
Headerコンポーネント
タイトルを描画させるだけなので、コードはシンプルです。
タイトルの内容をAppコンポーネントからpropsで受け取っています。
//Header.jsx import React from 'react'; import '../styles.css'; const Header = (props) => { return( <header className="toDo-header"> <h1>{props.headerTitle}</h1> </header> ); } export default Header;
Formコンポーネント
タイトル入力エリアはinput
内容入力エリアはtextareaで作成。
state更新のためのAddボタンをbuttonタグで作成し
全体をFormタグで囲っています。
classNameは独自のものとBootstrap由来のものが混在しています。
//Form.jsx
import React, {useState} from 'react';
import '../styles.css';
return (
<form className="toDo-form">
<div className="toDo-form-title input-group">
<div className="input-group-prepend">
<span className="input-group-text">Title</span>
</div>
<input
type="text"
className="form-control shadow"
/>
</div>
<div className="toDo-form-detail input-group">
<div className="input-group-prepend">
<span className="input-group-text">Detail</span>
</div>
<textarea className="form-control shadow"
></textarea>
</div>
<div className="toDo-form-add">
<button className="btn btn-success"
type="submit" >
Add
</button>
</div>
</form>
);
}
export default Form;
ToDoListコンポーネント
本来は入力したTodoリストが表示される部分ですが、
まだ追加・表示の機能を実装していないので分かる部分のみ記述しています。
//ToDoList.jsx import React from 'react'; import '../styles.css'; const ToDoList = (props) => { return( <div className="toDo-list"> <h1>Your Tasks: 0</h1> <div> //ここにTodoリストを表示するための記述をする </div> </div> ); } export default ToDoList;
Appコンポーネント
3つの子コンポーネントをインポートしています。
※importとexport defaultは忘れがちなので注意。
現時点では、Headerのみにprops(タイトル)を渡していますが、
今後機能を実装していく中で、他のコンポーネントにも都度propsを渡していきます。
//App.jsx
import React, { useState } from 'react';
import '../styles.css';
import Header from './Header';
import Form from './Form';
import ToDoList from './ToDoList';
const App = () => {
return(
<div className="toDo-app">
<Header headerTitle="To Do List Used By Hooks"/>
<div className="toDo-app-body container">
<div className="toDo-main">
<Form />
<ToDoList />
</div>
</div>
</div>
);
}
export default App;
まずは一旦これで、見た目が整いました。
現時点ではこのような状態になっています。

次回からは、この見た目を元に
Todoリストの追加などの機能を実装していきます。
↓↓私の師匠、もりけんさんの武骨日記。問題集、要チェック