ReactでTodoリストを作成しています。
todoリストのラジオボタンの『全て』『作業中』『完了』をクリックすると追加したタスクのボタンに合わせて、
表示・非表示になるようにしたいです。
以前、このサイトで質問をした際、エラーが出るのは、
『TypeScriptのソースコードを入力したのが原因』とこのサイトで教えて頂きました。
再度、reactの関数コンポーネントのサンプルを探し、
改めてソースコードを入力したが、
ラジオボタンをクリックしても、追加したタスクが表示/非表示にならず、
期待する動作をしない状況で、詰まっています。
何方かアドバイスをお願いします。
期待する動作
① タスクの状態によって表示/非表示を切り替えできる
② 選択されたラジオボタンに応じて、タスクの表示を切り替える
現在の状況
ソースコードを入力したが、ラジオボタンをクリックしても、追加したタスクが表示/非表示にならない。
検証ツールで、エラー表示が出ないので、何処に問題があるのかわからない。
問題解決の為に行ったこと
① 検証ツールを見ても、エラーの表示はなかった。
② ソースコードの書き間違いがないか確認した。
App.js
1 2import React, { useState } from "react"; 3 4//入力用 todos 5//未完了のTodo用 comment 6 7function App() { 8 const [todos, setTodos] = useState([]); 9 const [comment, setComment] = useState(""); 10 const [radio, setRadio] = useState("all"); 11 12const 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 onClickDelete = (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 = (todoId) => { 30 setTodos( 31 todos.map((todo, i) => 32 todoId === todo.id 33 ? { 34 ...todo, 35 status: todo.status === "incomplete" ? "completed" : "incomplete", // completed は「完了」を表す 36 } 37 : todo 38 ) 39 ); 40 }; 41 42 const switchTodos = () => { 43 if (radio === "complete") { 44 return todos.filter((todo) => todo.complete); 45 } 46 if (radio === "incomplete") { 47 return todos.filter((todo) => !todo.complete); 48 } 49 return todos; 50 }; 51 52 return ( 53 <div className="App-header"> 54 <h1>TODOリスト</h1> 55 56 <form> 57 <label> 58 <input type="radio" value="all" onChange={(e) => setRadio(e.target.value)} checked={radio === "all"} /> 59 全て 60 </label> 61 <label> 62 <input 63 type="radio" 64 value="incomplete" 65 onChange={(e) => setRadio(e.target.value)} 66 checked={radio === "incomplete"} 67 /> 68 作業中 69 </label> 70 <label> 71 <input 72 type="radio" 73 value="completed" 74 onChange={(e) => setRadio(e.target.value)} 75 checked={radio === "completed"} 76 /> 77 完了 78 </label> 79 </form> 80 81 <table> 82 <thead> 83 <tr> 84 <th>ID</th> 85 <th>コメント</th> 86 <th>状態</th> 87 </tr> 88 </thead> 89 <tbody> 90 {switchTodos().map((todo, index) => { 91 return ( 92 <tr key={todo.id}> 93 <td>{todo.id}</td> 94 <td>{todo.comment}</td> 95 <td> 96 <button onClick={() => toggle(todo.id)}>{todo.status === "incomplete" ? "作業中" : "完了"}</button> 97 <button onClick={() => onClickDelete(index)}>削除</button> 98 </td> 99 </tr> 100 ); 101 })} 102 </tbody> 103 </table> 104 105 <div> 106 <h2>新規タスクの追加</h2> 107 108 <input placeholder="Enter a new TODO" value={comment} onChange={(e) => setComment(e.target.value)} /> 109 <button onClick={addTodo}>追加</button> 110 </div> 111 </div> 112 ); 113} 114 115export 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
プレビュー