質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

285閲覧

react hooks: stateをうまく更新できない

hashikunmaru

総合スコア6

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2022/07/22 06:01

編集2022/07/22 06:26

前提

react×TSでクイズアプリを作っています。
ランダムでクイズを選択肢、それをクイズリストに追加していきたいのですが、上手く追加できずに困っています。

実現したいこと

  • 25行目のsetQuizListが動作し、quizListにクイズが追加されるようにしたい。

該当のソースコード

point

1 const [quizList, setQuizList] = useState<Quiz[]>([]); 2 const setQuizeez = () => { 3 const max = quizzes.length; 4 console.log(quizList); 5 for (let i = 0; i < questinoNum; i++) { 6 console.log(quizzes[randomNumber(max)]); 7 setQuizList([...quizList, quizzes[randomNumber(max)]]); 8 } 9 console.log(quizList); 10 }; 11 12 useEffect(() => { 13 console.log(quizList); 14 setQuizeez(); 15 setQuestion(quizList[quizProgress - 1]["question"]); 16 setAnswer(quizList[quizProgress - 1]["answer"]); 17 }, []); 18 19

all

1import React, { ChangeEvent, useEffect, useState } from "react"; 2import { quizzes, Quiz } from "../data/quizzes"; 3 4export type GameSceneProps = { 5 setScene: (scene: string) => void; 6}; 7 8export const GameScene: React.FC<GameSceneProps> = ({ setScene }) => { 9 const [quizProgress, setQuizProgress] = useState<number>(1); 10 const [inputAnswer, setInputAnswer] = useState<string>(""); 11 const [inputCheck, setinputCheck] = useState<string>(""); 12 const [question, setQuestion] = useState<string>(""); 13 const [answer, setAnswer] = useState<string>(""); 14 const questinoNum = 3; 15 const [quizList, setQuizList] = useState<Quiz[]>([]); 16 17 const randomNumber = (max: number) => { 18 return Math.floor(Math.random() * max); 19 }; 20 21 const setQuizeez = () => { 22 const max = quizzes.length; 23 console.log(quizList); 24 for (let i = 0; i < questinoNum; i++) { 25 console.log(quizzes[randomNumber(max)]); 26 setQuizList([...quizList, quizzes[randomNumber(max)]]); 27 } 28 console.log(quizList); 29 }; 30 31 const onchangeText = (e: ChangeEvent<HTMLInputElement>) => { 32 setInputAnswer(e.target.value); 33 }; 34 35 const submitAnswer = () => { 36 console.log(inputAnswer); 37 console.log(answer); 38 if (inputAnswer == answer) { 39 setQuizProgress((count) => count + 1); 40 setinputCheck(""); 41 console.log(quizProgress); 42 console.log(quizList); 43 setQuestion(quizList[quizProgress - 1]["question"]); 44 setAnswer(quizList[quizProgress - 1]["answer"]); 45 } else { 46 setinputCheck("違うよ!"); 47 } 48 setInputAnswer(""); 49 }; 50 51 useEffect(() => { 52 console.log(quizList); 53 setQuizeez(); 54 setQuestion(quizList[quizProgress - 1]["question"]); 55 setAnswer(quizList[quizProgress - 1]["answer"]); 56 }, []); 57 58 useEffect(() => { 59 if (quizProgress === 4) { 60 setScene("result"); 61 } 62 }, [quizProgress]); 63

試したこと

console.logを確認したところ、quizzes[randomNumber(max)]は正常に取得されており、setQuizList()前後ともに、空配列であることから、setQuizList()が動作していないと考える。
イメージ説明

const setQuizeez = () => { const max = quizzes.length; console.log(quizList); for (let i = 0; i < questinoNum; i++) { console.log(quizzes[randomNumber(max)]); setQuizList([...quizList, quizzes[randomNumber(max)]]); } console.log(quizList); };

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/07/22 06:09

> setQuizListの行がうまく動作してくれないことがわかった どこでどのような結果が得られたことから、そのように判断したのでしょうか?
hashikunmaru

2022/07/22 06:26

反応ありがとうございます。 判断した根拠を追加致しましたので、確認していただけると幸いです。
guest

回答1

0

ベストアンサー

setQuizList()前後ともに、空配列であることから、setQuizList()が動作していないと考える。

setQuizList()非同期で動作します。setQuizList()呼び出しの直後にquizListを参照しても書き換わっていない、というのは全く正常な動作です。

投稿2022/07/22 06:44

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hashikunmaru

2022/07/22 07:26

回答ありがとうございます。確かにそうですね。 非同期で動作していることがわかった次の段階がほんとに聞きたいことでした。 もし、よろしければこちらの質問に回答していただきたいです。お願いします。 https://teratail.com/questions/lgciapxb9971qy
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問