LoginSignup
toma3desuyo
@toma3desuyo

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Reactで作った英単語テストアプリでバグが起きてしまいます

現在英単語の学習サイトを作っています。そこで実装したい英単語テストアプリでバグが起きてしまいます。
 下記URLにソースコードを載せておきます。WordTest.jsxファイルで実装している機能をどなたか正常に動作するようにアドバイスいただけませんか? 

1.復習テストを行う⇨次のカードを表示するを複数回押した時に同じカードが出てきてしまうことがある。
2.同じく複数回押したときに以下のエラーコードが返される
CardList.jsx:8 Uncaught TypeError: Cannot read properties of undefined (reading 'id')
at CardList.jsx:8:1
at Array.map ()
at CardList (CardList.jsx:7:1)
at renderWithHooks (react-dom.development.js:16305:1)
at updateFunctionComponent (react-dom.development.js:19588:1)
at beginWork (react-dom.development.js:21601:1)
at HTMLUnknownElement.callCallback (react-dom.development.js:4164:1)
at Object.invokeGuardedCallbackDev (react-dom.development.js:4213:1)
at invokeGuardedCallback (react-dom.development.js:4277:1)
at beginWork$1 (react-dom.development.js:27451:1)

ソースコード https://github.com/toma3desuyo/word_memorize.git
Webサイト https://word-memorize-ff102.web.app

0

1Answer

まず大前提としてこのwebアプリがSPAであるということ。
ページの遷移がないのでロードされたコンポーネントは生き続けている。

1.復習テストを行う⇨次のカードを表示するを複数回押した時に同じカードが出てきてしまうことがある。

ここでshuffledArrayを生成してシャッフルしているが、これはuseStateの変数が反応する度にこのコードが走るので、何回もシャッフルされる。ので、後に使っているtestIndexが意味をなさない、なので同じカードが出る可能性が出てくる。
(更に言うとLocalStorageのcardsというitemがないという場合は考慮されてない)

2.同じく複数回押したときに以下のエラーコードが返される

ここで、インデックス外ならボタンの非表示はしているが、その後も別のカードをインデックス外からアクセスしようとするので、カードがない。newCardundefinedで渡すことになるので、idがないという表示になる。
単純にはelseを追加で回避できそうだけど、それ以前に構造的にうまく動いてない気はする。

(「次のカードを表示する」を押した後に、次となるインデックスがあるかどうかを判断して、次のカードがないなら、この時点でボタンを非表示にすべきだとは思う。今は次があるかどうかをとにかく押させてから判断してる。)

最初に言ったようにSPAなのでコンポーネントが取り除かれない限り生き続けているので、testIndexは常に増えて行っており、1に初期化されるのは表示されたその時だけ。

全体的にsetCardsを上の階層から使いまわしたり、色々まずいところが多いのでどこから初めて良いのか分からないが、少なくともreducerとかimmerとか使ったほうが処理か簡素化出来る気がする。

1

Comments

  1. @toma3desuyo

    Questioner

    ご丁寧にアドバイスありがとうございます!じっくり読ませていただきます。

Your answer might help someone💌