となっていたのと、countが更新されない現象があったので出来ませんでした。
おそらくこのようなコードを書いたのではないでしょうか?
js
1const [status, setStatus] = useState(0);
2setStatus(status + 1);
これはおそらく目的には叶わないでしょう。このsetStatus内のstateは初期値(この場合0)から変わらないため、setStatusに与えられる数値は(0 + 1)の値にしかならないでしょう。もし、statusが更新可能であれば、これはconst [status, ...
のjavascriptのconstの変数宣言に反するものでも、あるので、この挙動はある意味正しいものと思います。
なので、これは使えません。変わりに使えそうな内容を紹介いたします。
フックの基本的な使い方にありますが、その内容を少し引用します。この内容に関連しそうなのが
関数型の更新
新しい state が前の state に基づいて計算される場合は、setState に関数を渡すことができます。この関数は前回の state の値を受け取り、更新された値を返します。以下は、setState の両方の形式を用いたカウンタコンポーネントの例です。
js
1function Counter({initialCount}) {
2 const [count, setCount] = useState(initialCount);
3 return (
4 <>
5 Count: {count}
6 <button onClick={() => setCount(initialCount)}>Reset</button>
7 <button onClick={() => setCount(prevCount => prevCount - 1)}>-</button>
8 <button onClick={() => setCount(prevCount => prevCount + 1)}>+</button>
9 </>
10 );
11}
このように、
javascript
1setCount(prevCount => prevCount - 1)
という形で、Reactは、フックに関数を渡すことによって、その関数の引数が更新前の値を表わします。これを利用すれば良いでしょう。具体的には、質問者の書かれたコードの一部ですが、
javascript
1const initState = [true, false, false];
2
3export default function App() {
4 const [status, setStatus] = useState(initState);
5
6 useHotkeys("up,down,left,right", (e) => {
7 e.preventDefault();
8 // キーの方向
9 switch (e.key) {
10 case "ArrowUp":
11 break;
これをこのように書き直すと良いでしょう。
javascript
1export default function App() {
2 const [status, setStatus] = useState(0);
3 const menuLastIndex = 2;
4
5 // メニューの選択を次の選択にする
6 function nextMenuItem(prevStatus){
7 const isNext = prevStatus < menuLastIndex;
8 if(isNext){
9 return prevStatus + 1;
10 }else{
11 return prevStatus;
12 }
13 }
14
15 useHotkeys("up,down,left,right", (e) => {
16 e.preventDefault();
17 // キーの方向
18 switch (e.key) {
19 case "ArrowUp":
20 // 次の選択にすすむ
21 setStatus(nextMenuItem);
これは、メニューの選択をstatus
で管理しています。メニューの選択を数値で管理しているため、
javascript
1 <ListItem button divider={true} selected={status[0]}>
を、
javascript
1 <ListItem button divider={true} selected={status == 0}>
のように修正すると良いでしょう。
これらは、コードは全てではなく不完全ではありますが、質問者自身で補完できると思います。もし、分からなければコメントください。問題が解決されることを期待しています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/18 04:12
2021/06/18 06:57