やりたいこと
MyComponent をレンダー後、画面幅に応じて一度だけ実行したい処理を行い、以降画面幅が変更された時のために初期の画面幅を保持しておきたい
起きていること
最初に一度だけ実行したい処理の最後に画面幅をstateに保存しているのですが、以降の呼び出し時もずっとuseStateで初期化した時の値「0」が呼び出されてしまいます。
コード
JavaScript
1function MyComponent() { 2 const [lastWinW, setLastWinW] = useState(0); 3 4 // 最初に一度実行したい処理 5 const checkWinW = () => { 6 if(window.innerWidth > 768){ 7 // 処理 8 } else { 9 // 処理 10 } 11 12 setLastWinW(window.innerWidth); 13 } 14 15 // 幅に変更があった際に実行したい処理 16 const onResizeWinW = () => { 17 if(lastWinW != window.innerWidth){ // 高さの変更では実行しないように 18 console.log(lastWinW); // ログ表示は「0」で、checkWinWでのsetLastWinWが機能していない…? 19 // 処理 20 } 21 } 22 23 useEffect(() => { 24 checkWinW(); 25 window.onresize = onResizeWinW; // 画面幅を変えるとログに「0」が吐き出され続ける 26 }, []); 27 28 return ( 29 // レンダー内容 30 ) 31}
試したこと
stateが即時更新ではないことが原因かと思い、公式ドキュメントやその他のサイトを見つつ、setLastWinWのコールバックに引数としてlastWinWを用いるようにしてみましたが、結果は変わりませんでした。
どうかよろしくお願いします。。。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/15 09:45