useEffectで依存関係を解消するためにsetStateを使っていい?
useEffectで依存関係を解消するためにsetStateを使っていい?
reactでタイピングゲームを作っています
wordsを被りなくランダムに表示するために下のコードのような実装を行っています.
使用環境
"dependencies": {
"next": "13.1.1",
"react": "18.2.0",
"react-dom": "18.2.0"
}
該当するソースコード
const [words, setWords] = useState<Words[]>([...])
const [word, setWord] = useState<Word>({...})
const [index, setIndex] = useState<number>(0)
useEffect(() => {setWord(words[index])}, [words, index])
このような実装にすると, wordsとindexの両方の変更に反応してしまいます. どうにかして, missing dependencyを起こさずに, indexの変更のみに反応するようにしたいです.
自分で試したこと
useEffect(() => {
setWords((words) => {
setWord(words[index]);
return words;
});
}, [index]);
このように, wordsを依存関係に含めないようにするために, setWordsを使ってその中でwordsを参照するようにするのは正しい実装ですか? 可読性が悪い気がするし, あまり良い実装に思えません.
現在はonKeydownでindexを更新するような感じなのですが, それをやめて直接setWordをするような形にしたりするべきでしょうか?
この記事を見たのですが, 英語なのもありあまり理解できませんでした.
今回のアプリに限らず, useEffectの中でsetStateをこのような使い方をするのは良いのでしょうか?
よろしくお願いします.