🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
React.js

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

Q&A

解決済

1回答

1474閲覧

React ToDoリスト削除機能の追加

Kosuke0906

総合スコア13

React.js

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

1グッド

0クリップ

投稿2019/11/28 05:19

クリックしたら削除する関数を親コンポーネントで作成しそれを孫に渡すところまで完成しました。しかしその関数のロジック自体がミスをしているらしくエラーが出てしまっています。考えている関数のロジックとしては新しいリストの配列を作成し、クリックされた要素のインデックス取得後該当する要素を削除する流れで考えています!

######以下がそのエラー
ReferenceError: Cannot access 'todos' before initialization
removeTodos
src/App.js:13
10 | setTodos(newTodos);
11 | };
12 | const removeTodos = (todo) => {

13 | const todos=todos.slice();

| ^ 14 | const posi = todos.indexOf(todo);

15 | todos.splice(posi, 1);
16 | setTodos({ todos: todos });

App

1import React from "react"; 2import Form from "./Form"; 3import List from "./List"; 4 5const App = () => { 6 const [todos, setTodos] = React.useState(["走る", "跳ぶ", "投げる"]); 7 console.log(todos) 8 const addTodos = text => { 9 const newTodos = [...todos, text]; 10 setTodos(newTodos); 11 }; 12 const removeTodos = (todo) => { 13 const todos=todos.slice(); 14 const posi = todos.indexOf(todo); 15 todos.splice(posi, 1); 16 setTodos({ todos: todos }); 17 }; 18 return ( 19 <div> 20 <Form addTodos={addTodos} /> 21 <List todos={todos} removeTodos={removeTodos} /> 22 </div> 23 ); 24}; 25 26export default App;

List

1import React from "react"; 2import Item from "./Item"; 3 4const List = props => { 5 const todos = props.todos.map((todo, i) => { 6 return <Item key={i} desc={todo} removeTodos={props.removeTodos} />; 7 }); 8return <ol>{todos}</ol>; 9}; 10export default List; 11 12

Item

1import React from "react"; 2import styled from "styled-components"; 3const Item = (props) => { 4 const [isDone, setIsDone] = React.useState(false); 5 const toggleIsDone = () => setIsDone(!isDone); 6 const buttonText = isDone ? "戻す" : "完了"; 7 const handleClick=(todo)=> props.removeTodos(todo); 8 9 10 return ( 11 <li> 12 <p>{props.desc}</p> 13 <Button onClick={toggleIsDone}>{buttonText}</Button> 14 <button onClick={handleClick}>削除</button> 15 {/* ↑↑↑でクリック&削除のイベントハンドラ設置 */} 16 </li> 17 ); 18}; 19const Button = styled.button` 20 border-radius: 3px; 21 border: 2px solid pink; 22 color: pink; 23 margin: 0 1em; 24 padding: 0.25em 2em; 25`; 26export default Item; 27
退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

javascript

1const todos=todos.slice();

こう宣言した以上、この関数内でのtodosはこの宣言を指すことになり、外側のtodos見えなくなってしまいます

関数内のtodosを別な名前にしましょう。

投稿2019/11/28 05:25

maisumakun

総合スコア145965

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

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

Kosuke0906

2019/11/28 06:01

ありがとうございます! 関数内の問題は解決されました! TypeError: props.todos.map is not a function List src/List.js:5 2 | import Item from "./Item"; 3 | 4 | const List = props => { > 5 | const todos = props.todos.map((todo, i) => { 6 | return <Item key={i} desc={todo} removeTodos={props.removeTodos} />; 7 | }); 8 | return <ol>{todos}</ol>; このエラーが出ましたが、頑張ってみます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問