Reactの練習としてTodoアプリを作っているのだが、タスクを配列のStateで管理しようとした際につまづいたのでメモ。
配列に値を追加する際に通常使われるpush
メソッドだと、うまく機能しないため、下記コードのcreateTask
内22行目でおこなっているようにsetTasks
と...tasks
(スプレッド構文)を組み合わせて、配列の末尾にデータを追加する必要がある。
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
コンポーネントの中身はこのようになっている。
const Form = ({createTask}) => {
return (
<form onSubmit={createTask}>
<input type="text" name="taskName" />
<button type="submit">登録</button>
</form>
);
}
export default Form;
Form
コンポーネントの「登録ボタン」を押すとcreateTask
が走り、入力したタスク名が日付とともに、配列の末尾にオブジェクトとして保存される。