ToDoアプリでクリックしたリストの削除方法
Reactでtodoアプリの作成をしています。
追加する機能は作成したのですが、削除する機能のコードで苦戦中です。
ネットにたくさんあるクラスコンポーネントのやり方を真似して関数コンポーネントに組み込んでみましたが、苦戦中。
ソースコードは下記です。
よろしくお願いいたします!
発生している問題・エラーメッセージ
Warning: Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it.
該当のソースコード
App
1import React from "react"; 2import Form from "./Form"; 3import List from "./List"; 4 5const App = () => { 6 const [todos, setTodos] = React.useState([]); 7 const addTodos = text => { 8 const newTodos = [...todos, text]; 9 setTodos(newTodos); 10 }; 11 const removeTodos = (i) => { 12 const deleteTodos = [...todos]; 13 deleteTodos.splice(i,1); 14 setTodos(this.StaticRange.todos); 15 }; 16 return ( 17 <div> 18 <Form addTodos={addTodos} /> 19 <List todos={todos} removeTodos={removeTodos} /> 20 </div> 21 ); 22}; 23 24export default App; 25
親であるAppで作成したremoveTodos関数をpropsで孫であるItem.jsに渡します。
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} />; 7 }); 8 const removeTodos =props.removeTodos 9return <ol>{todos}{removeTodos}</ol>; 10}; 11export default List; 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=(e)=>{ 8 e.preventDefault(); 9 props.removeTodos() 10 } 11 return ( 12 <li> 13 <p>{props.desc}</p> 14 <Button onClick={toggleIsDone}>{buttonText}</Button> 15 <Button onclick={handleClick}>削除</Button> 16 {/* ↑↑↑でクリック&削除のイベントハンドラ設置 */} 17 </li> 18 ); 19}; 20const Button = styled.button` 21 border-radius: 3px; 22 border: 2px solid pink; 23 color: pink; 24 margin: 0 1em; 25 padding: 0.25em 2em; 26`; 27export default Item; 28 29
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/27 04:10