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

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

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

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

Q&A

解決済

1回答

752閲覧

React コンポーネント内の変数の取り扱い

退会済みユーザー

退会済みユーザー

総合スコア0

React.js

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

0グッド

0クリップ

投稿2021/08/30 02:29

Reactを勉強し始めて1週間目。独学でビンゴゲームの製作を試みています。

以下のようなプログラムでstartボタンを押したら0~99の間の数字をランダムに画面に表示、二回目にユーザーがボタンを押すとルーレットが停止し、その時画面に表示されている数字をそのラウンドで選ばれた数字として登録、また以降のラウンドで選ばれないようにしたいです。

作り始めた際には正常に操作することのできていた"yetNumber"という配列が、プログラムを組んでいくうちに以下のエラーメッセージとともに操作できなくなってしまいました。

react

1class App extends React.Component { 2 constructor(props) { 3 super(props); 4 this.state = {value: 0, 5 newNumber: 0, 6 btnValue: 'true' 7 }; 8 this.yetNumber = Array.from({length: 100}, (_, i) => i); //default arrary for playing game 9 this.alreadyNumber = []; // to rememmber the numbers that have chozen already 10 } 11 12 removeNum = (num) =>{ 13 this.yetNumber.splice(num, 1); //delete the number that showed on display 14 this.alreadyNumber.push(num); //make a array with numbers that showed on display 15 } 16 17 start = (range, intervalId) => { 18 19 intervalId = setInterval(()=>{ //repeat till player stop 20 let i = Math.floor( Math.random() * range); // make a index number randamly 21 this.setState({value: this.yetNumber[i]}); // show up the number 22 },50 23 ); 24 } 25 26 roulette(e) { 27 let text = e.target.innnerHTML; //change the text either start or stop 28 if(text === 'START'){ 29 text= 'STOP' 30 }else{ 31 text= 'START' 32 }; 33 34 let range = this.yetNumber.length +1; //determine currently length of the array 35 let intervalId = null; // for repeat function 36 37 if(this.btnValue === 'true'){ 38 this.setState({btnValue: 'false'}) // so that program can go to else at second time 39 this.start(range, intervalId); 40 }else{ 41 clearInterval(this.state.intervalId); // stop the start function 42 this.setState({newNumber: this.state.value}); 43 this.removeNum(this.state.value); 44 intervalId = null; 45 this.setState({btnValue: 'true'}) 46 } 47 48 } 49 50 render() { 51 52 return ( 53 <div className="app"> 54 <div className="displayArea"> 55 {this.state.value} 56 </div> 57 <div className="buttonArea"> 58 <button type="button" onClick={this.roulette}> 59 START 60 </button>

以下がchromeで実行した際のエラーメッセージです。

App.js:40 Uncaught TypeError: Cannot read property 'yetNumber' of undefined

roulette関数を書き始める前はthis.yetNumberでconsole.log等アクセスすることができていました。

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

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

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

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

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

p19ljk

2021/08/30 04:21

回答とは関係ないですが、記述方法が古くないですかね? せっかく勉強するのであれば新しいバージョンで勉強したほうが良いですよ! 関係ないコメント失礼しました。
guest

回答1

0

ベストアンサー

rouletteの定義を、roulette = e => { //以下略の形にしてください。

ふつうにメソッドを定義した上でonClick={this.roulette}のようにイベントハンドラとして渡すと、thisが正しく対応しなくなります。アロー関数で作ったメソッドは、thisが作った時点で固定されます。

投稿2021/08/30 02:53

maisumakun

総合スコア145208

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

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

退会済みユーザー

退会済みユーザー

2021/08/30 05:08

解答ありがとうございます。 上記のように変更してみたのですが、変更するとe.target.propertyが使えなくなってしまったのですがどうするべきなのでしょうか?ちなみにコンソールしたところundefinedになりました
maisumakun

2021/08/30 05:10

innnerHTMLのnが1個多いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問