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
が走り、入力したタスク名が日付とともに、配列の末尾にオブジェクトとして保存される。