クリックしたら削除する関数を親コンポーネントで作成しそれを孫に渡すところまで完成しました。しかしその関数のロジック自体がミスをしているらしくエラーが出てしまっています。考えている関数のロジックとしては新しいリストの配列を作成し、クリックされた要素のインデックス取得後該当する要素を削除する流れで考えています!
######以下がそのエラー
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/28 06:01