Reactで、Todoリストを作成しています。
Todoリストにタスクを追加し、追加したタスクの完了/作業ボタンを押したら、
ボックスの中に『false』『true』が表示されるのを解決したいです。
色々試してみたのですが、状況が変わりません。
何方かアドバイスをお願いします。
####期待する動作
Todoリストにタスクを追加し、完了/作業ボタンを押しても、『false』『true』が表示されず、
ボックスの中に『Enter a new TODO』が表示されるようにしたい。
####問題解決の為に行ったこと
1.検証ツールで、どういった実装が行われているか確認した。
App.js
1//書き換える前のソースコード 2 <h2>新規タスクの追加</h2> 3 <input placeholder="Enter a new TODO" value={comment} onChange={onChangeTodo} /> 4//書き換える後のソースコード 5 <h2>新規タスクの追加</h2> 6 <input onChange={onChangeTodo} />
『完了』『作業中』ボタンを押したら、value=" "に『false』『true』が表示。
タスク追加後、ボックスの中に『false』『true』が表示されるので、placeholder="Enter a new TODO" value={comment} の部分を消して、タスクを入力して追加ボタンを押したら、ボックス内に『追加したタスク』が表示されたままの状態になった。
2.関数はtoggleという関数の実装内容を確認してみた。toggleの宣言やボタンのコードを ① - ③ を入れて変えてみたが、症状は変わらなかった。
入力したソースコード
App.js
1//書き換える前のソースコード 2const toggle = () => { 3 setComment((prevState) => !prevState); 4 }; 5 6① const toggle = (value = false) => { 7 setComment((prevState) => !prevState, value); 8 }; 9 10② const toggle = () => { 11 const [comment, setComment] = useState(true); 12 13//書き換える前のソースコード 14 <button onClick={toggle}>{comment ? "作業中" : "完了"}</button> 15 16③<button onClick={() => setComment(!comment)}>{comment ? "作業中" : "完了"}</button>
App.js
1import { useState } from "react"; 2//入力用 todos 3//未完了のTodo用 comment 4function App() { 5 const [todos, setTodos] = useState([]); 6 const [comment, setComment] = useState(""); 7 8 const onChangeTodo = (e) => { 9 setComment(e.target.value); 10 }; 11 12 const addTodo = () => { 13 if (comment === "") return; 14 15 const todo = { 16 id: todos.length + 1, 17 comment, 18 status: "incomplete", 19 }; 20 setTodos([...todos, todo]); 21 setComment(""); 22 }; 23 const handleDelete = (index) => { 24 const newTodos = [...todos]; 25 newTodos.splice(index, 1); 26 setTodos(newTodos); 27 setTodos(newTodos.map((e, i) => ({ ...e, id: i + 1 }))); 28 }; 29 const toggle = () => { 30 setComment((prevState) => !prevState); 31 }; 32 33 return ( 34 <div className="App-header"> 35 <h1>TODOリスト</h1> 36 37 <form> 38 <label> 39 <input type="radio" id="all-Todo" name="Todo" defaultChecked /> 40 全て 41 </label> 42 <label> 43 <input type="radio" id="incomplete-Todo" name="Todo" /> 44 作業中 45 </label> 46 <label> 47 <input type="radio" id="complete-Todo" name="Todo" /> 48 完了 49 </label> 50 </form> 51 52 <table> 53 <thead> 54 <tr> 55 <th>ID</th> 56 <th>コメント</th> 57 <th>状態</th> 58 </tr> 59 </thead> 60 <tbody> 61 {todos.map((todo, index) => { 62 return ( 63 <tr key={todo.id}> 64 <td>{todo.id}</td> 65 <td>{todo.comment}</td> 66 <td> 67 <button onClick={toggle}>{comment ? "作業中" : "完了"}</button> 68 <button onClick={() => handleDelete(index)}>削除</button> 69 </td> 70 </tr> 71 ); 72 })} 73 </tbody> 74 </table> 75 76 <div> 77 <h2>新規タスクの追加</h2> 78 <input placeholder="Enter a new TODO" value={comment} onChange={onChangeTodo} /> 79 <button onClick={addTodo}>追加</button> 80 </div> 81 </div> 82 ); 83} 84export default App;
index.js
1import React from "react"; 2import ReactDOM from "react-dom"; 3import App from "./App"; 4 5ReactDOM.render(<App />, document.querySelector("#root"));
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/22 12:26