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

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

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

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

Q&A

解決済

2回答

1301閲覧

【React】Todoリストのタスク削除後のID番号を振り直すようにしたい

edu

総合スコア35

React.js

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

0グッド

0クリップ

投稿2021/09/16 02:12

編集2021/09/16 02:14

Reactで、Todoリストを作成しています。
Todoリストの削除ボタンを押したら、タスク削除後、タスクのIDの番号が振り直される機能を実装したいです。

色々調べて実装したのですが、これ以上積んでわからない状態です。
何方かアドバイスをお願いします。

#####現在の状況
Todoリストの削除ボタンを押したら、タスク削除後、タスクのID番号は振り直されることなく、追加した時の番号が表示される。

App.js

1import { useState } from "react"; 2 3//入力用 todos 4//未完了のTodo用 comment 5 6function App() { 7 const [todos, setTodos] = useState([]); 8 const [comment, setComment] = useState(""); 9 10 const onChangeTodo = (e) => { 11 setComment(e.target.value); 12 }; 13 14 const addTodo = () => { 15 if (comment === "") return; 16 17 const todo = { 18 id: todos.length + 1, 19 comment, 20 status: "incomplete", 21 }; 22 setTodos([...todos, todo]); 23 setComment(""); 24 }; 25 const onClickDelete = (index) => { 26 const newTodos = [...todos]; 27 newTodos.splice(index, 1); 28 setTodos(newTodos); 29 }; 30 31 return ( 32 <div className="App-header"> 33 <h1>TODOリスト</h1> 34 35 <form> 36 <label> 37 <input type="radio" id="all-Todo" name="Todo" defaultChecked /> 38 全て 39 </label> 40 <label> 41 <input type="radio" id="incomplete-Todo" name="Todo" /> 42 作業中 43 </label> 44 <label> 45 <input type="radio" id="complete-Todo" name="Todo" /> 46 完了 47 </label> 48 </form> 49 50 <table> 51 <thead> 52 <tr> 53 <th>ID</th> 54 <th>コメント</th> 55 <th>状態</th> 56 </tr> 57 </thead> 58 <tbody> 59 {todos.map((todo, index) => { 60 return ( 61 <tr key={todo.id}> 62 <td>{todo.id}</td> 63 <td>{todo.comment}</td> 64 <td> 65 <button>作業中</button> 66 <button onClick={() => onClickDelete(index)}>削除</button> 67 </td> 68 </tr> 69 ); 70 })} 71 </tbody> 72 </table> 73 74 <div> 75 <h2>新規タスクの追加</h2> 76 <input placeholder="Enter a new TODO" value={comment} onChange={onChangeTodo} /> 77 <button onClick={addTodo}>追加</button> 78 </div> 79 </div> 80 ); 81} 82 83export 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/09/16 02:19

> タスクのIDの番号が振り直される機能を実装したいです。 なぜ振り直さなければならないのでしょうか?
edu

2021/09/16 02:45

maisumakunさん、どのようなコードを書いたら、 追加したタスクの番号が振り直されるような実装ができるのか知りたいからです。 現在、Reactをアウトプット中心に勉強をしていて、アプリをカスタマイズをして レベルアップを図っています。 qiitaやdevで検索してTodoリストコードサンプルはたくさんあれど、 追加したTaskの番号を振り直される仕組みのTodoリストは見つからなかったので、 ここで質問しました。
hoshi-takanori

2021/09/18 06:35

Todo の質問が非表示になってるのでここに書きますが、まず toggle を書き換えて、 const toggle = (id) => { setTodos(todos.map(e => e.id === id ? { ...e, status: e.status === "incomplete" ? "complete" : "incomplete" } : e)); }; ボタンを次のようにすれば良いかと。 <button onClick={() => toggle(todo.id)}>{todo.status === "incomplete" ? "作業中" : "完了"}</button> (todo.status を文字列ではなく true/false にするともっと単純になりますが…。)
guest

回答2

0

追加したタスクの番号が振り直されるような実装ができるのか知りたいからです。

更新後に配列全体にmapをかけて、インデックスを供給していけば、できなくはないです。

ただし、データベースに保存するようなものであれば、idは振り直すべきではありません。

投稿2021/09/16 02:46

maisumakun

総合スコア146018

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

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

edu

2021/09/16 03:06

maisumakunさん、丁寧な解説、ありがとうございます! 何でも、idを振り直せば良い訳ではないのですね。
guest

0

ベストアンサー

一行の修正でちゃちゃっと済ますんなら、こないにするとか。

diff

1- setTodos(newTodos); 2+ setTodos(newTodos.map((e, i) => ({ ...e, id: i + 1 })));

そやけど、これ idやなくて、ただの行番号って感じやな。ま、好きにせえ。

追記:

上のは、修正を一行で済ませて、質問にあるコードをなるべく生かす案やけど、ワテならonClickDelete をこないに書くと思いますわ。

diff

1 const onClickDelete = (index) => { 2- const newTodos = [...todos]; 3- newTodos.splice(index, 1); 4- setTodos(newTodos); 5+ setTodos( 6+ todos.filter((_, i) => i !== index).map((e, i) => ({ ...e, id: i + 1 })) 7+ ); 8 }; 9

あ、あと、関数名も onClickDelete やなく、 handleDelete にするかも。なぜゆうたら

  • イベントリスナーの変数名にhandleをプレフィックスにするのは、しばしば見られる慣習
  • 要素の削除は、(今のところはクリックだけがトリガーでも、)クリックだけによって生じるものではないから

投稿2021/09/16 02:46

編集2021/09/16 03:16
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

edu

2021/09/16 03:08

suwmn50799、アドバイスありがとうございます! 期待する実装ができるようになりました!
退会済みユーザー

退会済みユーザー

2021/09/16 03:17

そら、おめっとうさん。別案も追記したで〜
edu

2021/09/16 23:47

suwmn50799さん、別案の『handleDelete』の解説ありがとうございます! 解説を見て、『handleDelete』に変更しました。
退会済みユーザー

退会済みユーザー

2021/09/17 02:43

おおきに〜 コンポーネントの onXXX に設定するコールバックの変数名のプレフィクスを handle にする考え方が書いてある投稿としては以下があります。 stackoverflowの質問 What is the right name of event handler? onClick or handleClick? への回答 ・ https://stackoverflow.com/a/60048346 ブログ記事 ・ https://jaketrent.com/post/naming-event-handlers-reacthttps://javascript.plainenglish.io/handy-naming-conventions-for-event-handler-functions-props-in-react-fc1cbb791364
edu

2021/09/17 10:26

suwmn50799さん、投稿記事の案内、ありがとうございます! DeepLを使って、読んでみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問