前提
以下のような実装をしています。親が子を追加でき、子供は自分自身を削除できるようなコンポーネントです
js
1// 親コンポーネント 2function Parent(props) { 3 const [childList, setChildList] = useState([]); 4 useEffect(() => { 5 // サーバからのデータがあったらstateに設定する 6 if(props.childList.length != 0){ 7 const list = props.childList.map((child) => { 8 return createChild(child); 9 }); 10 setChildList(list); 11 12 } 13 }, []); 14 15 return( 16 <> 17 {childList} 18 <button onClick={add}>Child追加</button> 19 </> 20 ) 21 22 function createChild(child){ 23 return ( 24 <Child 25 data={child} 26 /> 27 ) 28 } 29・・・ 30} 31 32// 子コンポーネント 33function Child(props) { 34 useEffect(() => { 35 return () => { 36 // クリーンアップ処理 37 console.log('delete!') 38 }; 39 }, []); 40 41 return ( 42 <> 43 <p>{props.data.name}</p> 44 <button onClick={delete}>自分を削除</button> 45 </> 46 ) 47}
事象内容
サーバからデータをもらって表示した後に、子コンポーネントの削除を実行してもクリーンアップが呼ばれません。
新しく追加した子コンポーネントを削除した時はクリーンアップが呼ばれます。
※補足
クリーンアップが呼ばれない手順としては例えばホーム画面と編集画面があったとして
以下のような形になります
1.編集画面で子をいくつか作る
親
→子
→子
2.データベースに保存してホーム画面へ遷移
3.もう一度編集画面へ遷移して表示
親
→子
→子
4.子を削除。クリーンアップが起動しない。'delete!'がコンソールに表示されない
親
→子
質問事項
- クリーンアップの処理が間違っているでしょうか
- クリーンアップが呼ばれないケースは何かあるでしょうか
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/12/01 14:40
2021/12/01 21:46
2021/12/03 02:10