Reactの練習としてTodoアプリを作っているのだが、タスクを配列のStateで管理しようとした際につまづいたのでメモ。

配列に値を追加する際に通常使われるpushメソッドだと、うまく機能しないため、下記コードのcreateTask内22行目でおこなっているようにsetTasks...tasks(スプレッド構文)を組み合わせて、配列の末尾にデータを追加する必要がある。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import { useState } from 'react';
import Form from './components/Form';
 
function App() {
  const [tasks, setTasks] = useState([
    {
      name: 'task1',
      date: '2021-11-30 12:00:00',
    },
    {
      name: 'task2',
      date: '2021-11-30 13:00:00',
    },
  ]);
 
  const createTask = (e) => {
    e.preventDefault();
    const { taskName } = e.target.elements;
    const now = new Date();
    const nowFormated = `${now.getFullYear()}-${('0'+(now.getMonth()+1)).slice(-2)}-${('0'+now.getDate()).slice(-2)}`;
 
    setTasks([...tasks, {
      name: taskName.value,
      date: nowFormated,
    }]);
  }
 
  return (
    <>
      <Form createTask={createTask} />
    </>
  );
}
 
export default App;

ちなみにcreateTaskを実行するFormコンポーネントの中身はこのようになっている。

01
02
03
04
05
06
07
08
09
10
const Form = ({createTask}) => {
  return (
    <form onSubmit={createTask}>
      <input type="text" name="taskName" />
      <button type="submit">登録</button>
    </form>
  );
}
 
export default Form;

Formコンポーネントの「登録ボタン」を押すとcreateTaskが走り、入力したタスク名が日付とともに、配列の末尾にオブジェクトとして保存される。