Reactでtodoアプリを作ろう①:環境構築~コンポーネント作成

今回からReactの学習記録をスタートさせたいと思います。

Reactを選んだ理由は、以前作成した「ポモドーロタイマー」を
最終的にReact/Reduxにリプレイスするためです。


そのためには、React自体の理解が必須です。
まずは、簡単なアプリの作成を通して理解を深めていくことにしました。


※そもそも、なぜポモドーロタイマーをReact/Reduxにリプレイスしたいかというと
私が目指している企業の「求める経験」の中にReactが多かったためです。
Reactに合わせて、その周辺知識であるReact/Reduxまで理解しておきたく学習を進めています!

完成品イメージ


今回のアプリの完成イメージです。

f:id:hnm-n-1029:20200722162212p:plain
完成品イメージ

タイトルと内容を分けて入力する仕様になっています。

環境構築

早速、環境構築から始めていきます。

今回は最も簡単に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;


まずは一旦これで、見た目が整いました。
現時点ではこのような状態になっています。


f:id:hnm-n-1029:20200722231336p:plain


次回からは、この見た目を元に

Todoリストの追加などの機能を実装していきます。



↓↓私の師匠、もりけんさんの武骨日記。問題集、要チェック

kenjimorita.jp