質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1159閲覧

【React】Todoリストでタスク追加後にボタンを押したら、タスク追加ボックスの中に『false』『true』が表示されるのを解決したい

edu

総合スコア35

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

1クリップ

投稿2021/09/22 02:17

編集2021/09/22 02:23

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"));

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

修正するとこ、2箇所あってん。こないにしてみたって。

diff

1 2 setTodos(newTodos.map((e, i) => ({ ...e, id: i + 1 }))); 3 }; 4- const toggle = () => { 5- setComment((prevState) => !prevState); 6+ const toggle = (index) => { 7+ setTodos(todos.map((todo, i) => 8+ index === i ? { 9+ ...todo, 10+ status: todo.status === 'incomplete' ? 'completed' : 'incomplete', // completed は「完了」を表す 11+ } : todo)); 12 }; 13 14 return (

diff

1 <td>{todo.id}</td> 2 <td>{todo.comment}</td> 3 <td> 4- <button onClick={toggle}>{comment ? "作業中" : "完了"}</button> 5+ <button onClick={() => toggle(index)}>{todo.status === 'incomplete' ? "作業中" : "完了"}</button> 6 <button onClick={() => handleDelete(index)}>削除</button> 7 </td> 8 </tr>

または、idを使ってstatusをトグルする要素を指定してもええ。修正箇所は、上に同じ2箇所や。

diff

1 2 setTodos(newTodos.map((e, i) => ({ ...e, id: i + 1 }))); 3 }; 4- const toggle = () => { 5- setComment((prevState) => !prevState); 6+ const toggle = (todoId) => { 7+ setTodos(todos.map((todo, i) => 8+ todoId === todo.id ? { 9+ ...todo, 10+ status: todo.status === 'incomplete' ? 'completed' : 'incomplete', // completed は「完了」を表す 11+ } : todo)); 12 }; 13 14 return (

diff

1 <td>{todo.id}</td> 2 <td>{todo.comment}</td> 3 <td> 4- <button onClick={toggle}>{comment ? "作業中" : "完了"}</button> 5+ <button onClick={() => toggle(todo.id)}>{todo.status === 'incomplete' ? "作業中" : "完了"}</button> 6 <button onClick={() => handleDelete(index)}>削除</button> 7 </td> 8 </tr>

投稿2021/09/22 06:24

編集2021/09/22 06:45
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

edu

2021/09/22 12:26

suwmn50799さん、丁寧な回答、ありがとうございました! ここのソースコードが怪しいのはわかっていたのですが、 何がどのようにしたらまではわからなかったので、助かりました! 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問