🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

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

Q&A

1回答

418閲覧

React 変数の値が異なってしまう。

Patao150205

総合スコア10

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

React.js

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

0グッド

0クリップ

投稿2021/03/09 10:19

編集2021/03/09 12:44

イメージ説明### 前提・実現したいこと
タイピングゲームを作っています。

returnの中のUntyped変数の値とreturnの外の変数の値を等しいものにしたい。

発生している問題・エラーメッセージ

returnの中のunTypedでブラウザに表示される、値とreturnの直前のConsole.logとでは、値が異なったものになってします。

該当のソースコード

import React from 'react'; const DisplayRandomCharacter = (props) => { const wordsList = props.wordsList; const currentWord = wordsList[Math.floor(Math.random() * wordsList.length)]; console.log(currentWord) let typed = ''; let unTyped = currentWord; console.log(currentWord.slice(1)) let currentChracter = unTyped.charAt(0); console.log(unTyped.charAt(0)); window.addEventListener('keydown', (event) => { if (event.key === currentChracter) { console.log(unTyped) typed += currentChracter; unTyped = currentWord.slice(1); console.log(currentChracter); currentChracter = unTyped.charAt(0) console.log(unTyped.charAt(0)) } }) console.log(unTyped) return( <p className={props.className}><span className="typed">{typed}</span><span className="unTyped">{unTyped}</span></p> ) } export default DisplayRandomCharacter;

試したこと

DisplayRandomChracterは、関数コンポーネントです

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

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

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

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

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

guest

回答1

0

returnの中のUntyped変数の値とreturnの外の変数の値を等しいものにしたい。

無理です。

そもそも、window.addEventListener内の関数はイベント発生時に実行されるので、外側console.log(unTyped)のほうが先に実行されます。あとからイベントハンドラで影響を与えることはありません。

(状態に応じて変わる値を管理したいなら、useStateでReact内での管理を行う必要があります)

投稿2021/03/09 10:39

maisumakun

総合スコア145965

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

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

Patao150205

2021/03/09 11:51

let untyped = currentWordで、1ヶ所でしか代入していない。 (let untyped = currentWordの直後からreturnの直前のconsoleの直前までコメントアウトしてます。) Stateをセットして状態を変えて再レンダリングしたわけでもない。でもreturnの内外で全く別の単語が入ってしまう。なぜMathrandomでランダムで、単語が生成されてしてしまっているのでしょうか?どうしてこうなるのかさっぱり分かりません。 意図しないunTypedの値の生成はどのように起こっているのかを教えて頂きたいです。
Patao150205

2021/03/09 11:53

コメントアウトしたものを削除したソースコードです。 import React from 'react'; const DisplayRandomCharacter = (props) => { const wordsList = props.wordsList; const currentWord = wordsList[Math.floor(Math.random() * wordsList.length)]; console.log(currentWord) let typed = ''; let unTyped = currentWord; console.log(unTyped) return( <p className={props.className}><span className="typed">{typed}</span><span className="unTyped">{unTyped}</span></p> ) } export default DisplayRandomCharacter;
maisumakun

2021/03/09 12:18

> 意図しないunTypedの値の生成はどのように起こっているのかを教えて頂きたいです。 残念ながら、本来の「意図」のほうがわからないです。
maisumakun

2021/03/09 12:19

> Stateをセットして状態を変えて再レンダリングしたわけでもない。でもreturnの内外で全く別の単語が入ってしまう。 コメントアウトした状態での「returnの内外」は、何を指していますか?
Patao150205

2021/03/09 12:49 編集

まず、実現したいこととしては、 const currentWord = wordsList[Math.floor(Math.random() * wordsList.length)];で配列からランダムに取り出した単語を変数に入れて、タイプをしていない単語としてそのまま、unTypedの変数に代入しています。その、Untypedの変数をブラウザでこれから打つべき単語として表示したいと思っています。 なので、ここでの意図しないとは、本来,returnの直前のconsole.logと<p>タグとしてブラウザに、出力される単語は、全く同じ単語を表示するはずですが、なぜか、コンソールで表示された値とブラウザに表示された単語が異なり、同じでなければいけない単語が異なり、全く別に意図しない単語が生成されていることを意味しています。 よろしければ、画像の方も添付しましたので、ご覧ください。
maisumakun

2021/03/09 12:51

エラーメッセージとして「Each child in a list should have a unique "key" prop」と出ていますが、このコンポーネントをどのように使っているのでしょうか? 親コンポーネントが存在する場合、親の都合で再描画が走ることがありえます。
Patao150205

2021/03/09 13:24

切り抜きました <SelectNumBox key="minutes" className="time-selector" firstNum={0} lastNum={6} riseNum={1}></SelectNumBox> <SelectNumBox key="seconds" className="time-selector" firstNum={0} lastNum={60} riseNum={5}></SelectNumBox> Consoleは、この値のkeyがuniqueではないと怒っているようですね。keyを設定しているのですが.... keyは、パフォーマンスが落ちるだけで、特に影響がないと思っていて放置していましたが、やっぱなんかしら影響あるのですね。 コンポーネント構成です。 App--| FirstScreen--| selectNumbox key="minutes" selectNumbox key="seconds" App--| Timer DisplayRandomCharacter Appより下は条件分岐でページごとに付け替えています。
maisumakun

2021/03/09 13:35

質問にあるconsole.logの数に対して、出力されるものが少ないように見受けられます。
Patao150205

2021/03/09 13:44

コメントアウトしているので、本来表示されるべき2つのConsole.logはブラウザのConsoleで2つ表示されているので、出力される値の数は正しいかと。
Patao150205

2021/03/09 22:22

keyのエラーは解消できました。しかし、値が異なってしまうのは、なおりませんでした。
maisumakun

2021/03/09 23:08

currentWordが「再描画のたびにどれが選ばれるかわからない」という構造自体が、おそらく適切なものではありませんので、useStateを使って一度初期化した後は同じ値を保持するようにしたほうがいいでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問