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

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

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

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

Q&A

解決済

1回答

1594閲覧

【react】Todoリストの追加したタスクの表示・非表示を切り替えたい。

edu

総合スコア35

React.js

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

0グッド

1クリップ

投稿2021/09/30 02:15

編集2021/10/01 03:26

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

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

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

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

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

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

maisumakun

2021/10/01 02:54

> 期待する動作にならない。 とありますが、現状はどのような動作になっているのでしょうか?「表示すらされない」と「ボタンが出るけど、押しても反応しない」と「ボタンが出て押せるけど、意図しない動作が起きる」では、また対応が違ってくることが考えられます。
edu

2021/10/01 03:00

maisumakunさん、丁寧なアドバイス、ありがとうございます! 質問の内容の指摘、自身の説明不足でした。 質問内容を訂正します。
guest

回答1

0

ベストアンサー

switchTodos()が間違うてるで。
あるtodoの完了、未完の値は、status プロパティに入ってるやん。そやから最小限の修正でやるなら、こう

diff

1 const switchTodos = () => { 2- if (radio === "complete") { 3- return todos.filter((todo) => todo.complete); 4+ if (radio === "completed") { 5+ return todos.filter((todo) => todo.status === 'completed'); 6 } 7 if (radio === "incomplete") { 8- return todos.filter((todo) => !todo.complete); 9+ return todos.filter((todo) => todo.status === 'incomplete'); 10 } 11 return todos; 12 }; 13

やけど、こない

javascript

1const switchTodos = () => radio === "all" ? todos : todos.filter(({ status }) => status === radio);

に、一行でも書けるよってに。

補足

以下は本題とは無関係なお節介なので、時間あるときにでも読んでみてや。

ここんとこ

jsx

1 <form> 2 <label> 3 <input type="radio" value="all" onChange={(e) => setRadio(e.target.value)} checked={radio === "all"} /> 4 全て 5 </label> 6 <label> 7 <input 8 type="radio" 9 value="incomplete" 10 onChange={(e) => setRadio(e.target.value)} 11 checked={radio === "incomplete"} 12 /> 13 作業中 14 </label> 15 <label> 16 <input 17 type="radio" 18 value="completed" 19 onChange={(e) => setRadio(e.target.value)} 20 checked={radio === "completed"} 21 /> 22 完了 23 </label> 24 </form>
<form>の中に、ラジオボタン3つ並べてるんやけど、似たようなコードのかたまりが3回連続するやん。そやから <label>から </label> までんとこ、別のコンポーネントに切り出すとええで。やり方の一例としては、こんなん

diff

1import React, { useState } from "react"; 2 3+const FILTER_VALUES = [ 4+ { value: "all", text: "全て" }, 5+ { value: "incomplete", text: "作業中" }, 6+ { value: "completed", text: "完了" } 7+]; 8+ 9+const FilterButton = ({ value, text, checked, onChange }) => ( 10+ <label> 11+ <input 12+ type="radio" 13+ value={value} 14+ onChange={(e) => onChange(e.target.value)} 15+ checked={checked} 16+ /> 17+ {text} 18+ </label> 19+); 20 21 //入力用 todos 22 //未完了のTodo用 comment 23 24 function App() { 25 const [todos, setTodos] = useState([]);

を追加しといて、こうや。

diff

1 <form> 2- <label> 3- <input type="radio" value="all" onChange={(e) => setRadio(e.target.value)} checked={radio === "all"} /> 4- 全て 5- </label> 6- <label> 7- <input 8- type="radio" 9- value="incomplete" 10- onChange={(e) => setRadio(e.target.value)} 11- checked={radio === "incomplete"} 12- /> 13- 作業中 14- </label> 15- <label> 16- <input 17- type="radio" 18- value="completed" 19- onChange={(e) => setRadio(e.target.value)} 20- checked={radio === "completed"} 21+ {FILTER_VALUES.map(({ value, text }) => ( 22+ <FilterButton 23+ key={value} 24+ value={value} 25+ text={text} 26+ checked={radio === value} 27+ onChange={setRadio} 28 /> 29- 完了 30- </label> 31+ ))} 32 </form>

投稿2021/10/01 03:39

編集2021/10/01 04:04
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

edu

2021/10/01 12:27

suwmn50799さん、いつも丁寧な解説付きの回答、ありがとうございます! 追加したタスクの完了/未完の値は、『status』 プロパティに入っているのを思い付かなかった点が 自身の反省点です。 補足の解説を含めて、本当に、ありがとうございました!
退会済みユーザー

退会済みユーザー

2021/10/01 13:20

おおきに〜 ところでeduさんはGitを使えますか? 今回 Todoリストを作りながら、段階的に様々な機能を追加する中で、コードを追加したり修正したり削除したりしたと思いますが、何かの習得(今回はReactの基礎)のためのプロジェクトではコードを追加したり削除したり したときに、何の意図でそれを行ったかの履歴を後で見返せると次への土台になります。 あるまとまった機能を追加するたびに、そのために行った追加、修正を振り返れば、次の機能追加のときに 前回追加したコードのどこを使えるかの見当をつけることができます。 そのためのコード修正履歴を残すものとして、Gitは欠かせないツールです。 そしてできれば学習用に作ったものはGitHubに入れておくとよいです。 このサイトで質問するときもそうですが、自分の書いたコードを人に見てもらい修正の提案だったりが欲しいときに、「GitHub のここに入れてあります」とURLを教えれば話が早いです。 まだGitやGitHubにまったく触ったことがないのでしたら、入門記事を検索して目を通してみるとよいかもしれません。
edu

2021/10/02 01:00

suwmn50799さん、アドバイス、ありがとうございます! GitとGit Hubは、コードレビューができる程度ですが使えます。 コード修正履歴など教えて頂いた内容は、プログラミングはこの積み重ねだと思うので、 Git Hubを使用しながら学習するのとNotionを使ってわかるようにはしています。 いつも丁寧なアドバイスと解説、本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問