2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DENSOAdvent Calendar 2022

Day 17

ReactでToDoアプリ作ってみた

Last updated at Posted at 2022-12-17

概要

普段クラウドのインフラをメインで勉強していますが、フロント側を学んでみたいと思いました。
今回は、Reactを簡単に勉強してToDoアプリを作成してみました。

成果物

学んだこと

JSX記法

Reactでは、JSX記法が使えます。
JSX記法とは、Javascriptを拡張した言語でHTMLのタグを書けるようになっています。

  • Javascriptの中に、HTMLを記述することが可能
  • HTML内に{}を使用することで、Javascriptの変数を渡すことが可能
Inputarea.jsx
import '../App.css';

function Inputarea(props) {
  const { taskname, onChangeInputArea, onChangeAddtaskButton} = props;
  return (
    //HTMLを書くことができる & {}を使用することでJavascriptの変数を渡すことができる
    <div className='input-area'>
        <input placeholder='タスク名を入力' value={taskname} onChange={onChangeInputArea}/>
        <button onClick={taskname && onChangeAddtaskButton}>追加</button>
    </div>
  );
}

export default Inputarea;

State

Reactでは、Stateが使えます。
Stateとは、ユーザの操作によって変化する状態を管理するために使用されます。

今回の例だと、ToDoリストの中身はユーザの操作によって変化します。

  • タスク追加ボタンを押した時、ToDoリストの中身は増える
  • ToDoリストの完了ボタンを押した時、ToDoリストの中身は減る
  • Doneリストの戻るボタンを押した時、ToDOリストの中身は増える

上記のような際に、Webページの画面を再度レンダリングする必要があります。
再レンダリングをするには、タスクの名前が必要となりこれをStateで配列として管理をします。
Stateの中身が変更されると、再レンダリングが行われます。これでHTMLの中身を変更することができます。

↓コードの一部を抜粋

App.jsx
import { useState } from 'react';

function App() {
  // 分割代入を使用
  // 左側の変数がStateの値を管理している配列を格納する変数名
  // 右側がStateの値を変更する際の関数名
  const [taskname, settaskname] = useState('');
  const [todotasklist, settodotasklist] = useState('');

  // テキストボックスの値が変化したときに、tasknameの値をStateにセットする
  const onChangeInputArea = (event) => settaskname(event.target.value);

  // 「追加」ボタンが押されたときに実行される関数
  const onChangeAddtaskButton = () => {
  // スプレッド構文を使用して、既存のtaskの名前を管理している配列 + 追加されたtaskの名前をnewtodotasklistに入れる
    const newtodotasklist = [...todotasklist, taskname];
  // Stateを変更する
    settodotasklist(newtodotasklist);
  // ToDoリストへの追加が完了したので、消す
    settaskname('');
  }

  return (
    <>
      <p>タスク追加</p>
      <Inputarea taskname={taskname} onChangeInputArea={onChangeInputArea} onChangeAddtaskButton={onChangeAddtaskButton} />
      <p>ToDOリスト</p>
      <Todolist todotasklist={todotasklist} onChangeCompleteTaskButton={onChangeCompleteTaskButton} />
    </>
  );
}

export default App;
Todolist.jsx
import '../App.css';

function Todolist(props) {
  const { todotasklist, onChangeCompleteTaskButton} = props;
  return (
    <div className='todo-list'>
    {/* todotasklistの値が空でないかつ変更が加わった際に画面の再レンダリングが行われる */}
        {todotasklist && todotasklist.map((todotask, index) => {
          return (
            <div key={index} className='task-layout'>
              <p>{todotask}</p>
              <button onClick={() => onChangeCompleteTaskButton(index)}>完了</button>
            </div>
          );
        })}
      </div>
  );
}

export default Todolist;

コンポーネント化

Reactでは、HTMLをコンポーネントとして分けて開発をすることができます。
そのため、コードのメンテナンスがしやすい等のメリットがあります。
今回は、4つのコンポーネントに分割しました。

  • Header.jsx
  • Inputarea.jsx
  • Todolist.jsx
  • Donelist.jsx

最後に

いつもとは違う学びがあり、面白かったです!
また、フロント部分の技術にも挑戦していきたいと思います!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?