実現したいこと
概要
useState()でstateの値が更新されないので、更新したい。
詳細
useStateでconst [isStart, setIsStart] = useState(false);
を定義しています。
またisStart
を更新する関数として、以下二つの関数を定義しています。
js
1 const startGame = () => { 2 setIsStart(true); 3 }; 4 const endGame = () => { 5 setIsStart(false); 6 };
私の想定では、スペースキーをクリックすれば、isStart
がtrueに、escキーをクリックすれば、isStart
がfalseになると思っているのですが、
スペースキーをクリックしても、case 32のconsole.log(isStart)
ではfalseと出力されます。
その後、escキーを押してもisStart
が更新されていないか、ifブロックに入ってくれません。
このコードでは、stateは更新されないのでしょうか?
発生している問題
useState()でstateの値が更新されない。
該当のソースコード
js
1import React, { useCallback, useEffect, useState } from 'react'; 2 3const Typing = () => { 4 const [isStart, setIsStart] = useState(false); 5 const startGame = () => { 6 setIsStart(true); 7 }; 8 const endGame = () => { 9 setIsStart(false); 10 }; 11 const onClickKey = useCallback((event) => { 12 switch (event.which) { 13 // スペースキーコードは32。 14 case 32: 15 console.log(isStart) // falseと出る 16 startGame(); 17 break; 18 // エスケープキーコードは243。 19 case 27: 20 if (isStart) { 21 console.log(isStart) // isStartがずっとfalseのためこのブロックに入らない 22 endGame(); 23 }; 24 break; 25 default: 26 break; 27 } 28 }, [isStart]); 29 30 useEffect(() => { 31 document.addEventListener("keydown", onClickKey, false); 32 }, []); 33 34 return ( 35 <div className="typing"> 36 <Timer 37 isStart={ isStart } 38 /> 39 </div> 40 ) 41} 42 43export default Typing
試したこと
useState()でstateが更新されないことをググってみたが、パッとした記事が見つかりませんでした。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/06 17:50
2021/09/07 02:34