以下全て 

 

React 公式チュートリアル

 

「 https://reactjs.org/tutorial/tutorial.html 」

 

を参考にさせていただいております。

 

 

 

前回記事

React㉙ Setting button to review history

の続きです。

 

 

 

 

 

本記事の目的

過去の任意の打ち手に戻れる機能(ボタン)を作成する。

後編

 

 

 

 

 

 

前回は祖父母コンポーネントGameのstate(プロパティ)のオブジェクト内に新たにstepNumberプロパティを設置しました。

(101行目)

 

<button>タグがクリックされるとonClickイベントにより、関数jumpToが呼ばれ、

stepNumberプロパティxIsNextプロパティ合わせて.setStateメソッドを用いて更新されました。

(stateの更新)

Reactでは .setStateが呼ばれると必ずrenderメソッドが再度呼ばれ、更新後のstateを用いたJSXで画面が再レンダリングされます。

 

 

renderメソッドが再度呼ばれ更新後のstateを用いたJSXで画面が再レンダリングされるときに

押されたbutttonに対応した打ち手の履歴(過去の画面)に戻った画面を表示しなければいけません。

 

 

 

ex

例えば

3. のボタンが押されたら#2の履歴画面を表示。

=

 配列history [ {square : Array(9) }  ,  {square : Array(9)} , {square : Array(9)}  ・・・] におけるindex番号2

の要素  ( stepNumber= 2 )

を用いて9マスの○X状態をレンダリングします。

(過去の9マス状態を表示。)

 

 

 

その時にstateで設定したsetNumberプロパティを用います。

renderメソッド内の記述を修正。

 

引用

 

we will modify the Game component’s render method from always rendering the last move to rendering the currently selected move according to stepNumber

 

出典 :  https://reactjs.org/tutorial/tutorial.html#implementing-time-travel

 

 

 

 

↑の記述のように修正します。

 

 

↓134行目

 

これで配列hitoryの要素のうち、

stepNumber(=配列historyのindex番号)で指定されたある過去の打ち手の9マスの要素

がcurrentへと入れられ、レンダリングすることができます。

 

 

 

 

 

 

 

 

 

ではその過去の状態を表示しているときに

新たにマスがクリックされ、新しく○Xがつけられたら?

 

 

handleclick関数を変更する。

 

handleclick関数

・・・子コンポーネント側から祖父母コンポーネントのstateを更新できるように

祖父母コンポーネントGame→親コンポーネントBoard→子コンポーネントSquareへとpropsにのせて渡して使わせる関数。

 

 

現在、子コンポーネントsquare(1マス分)をクリックするとpropsによって子コンポーネントまで渡された

祖父母コンポーネントGame内のhandleclickメソッドが呼び出される。

→handleclickメソッド内のsetStateでstateを更新。

 

 

 

ここからが本題

ある過去の任意の打ち手の9マスを表示している時に

新しく子コンポーネントsquare(1マス)がクリックされ、新しい○Xがつけられたら

その時点(今表示している過去の任意の9マス)でのstepNumberに+1ながらコピーを作り、新たにhistory配列とします。

 

const history = this.state.history.slice(0, this.state.stepNumber + 1);

 

そしてその↑history配列の要素の数を新たにstateのオブジェクトのstepNumberプロパティ とします。

 

this.setState({

history: history.concat([{

squares: squares,

}]),

stepNumber: history.length,

xIsNext: !this.state.xIsNext,

});

 

 

 

祖父母コンポーネントGame内handleClickメソッド

108行目と119行目

 

 

これで

ある任意の過去の打ち手の状態(過去の9マス)を表示しているときに

新たにマスがクリックされ、新しく○Xがつけられたら

その過去の打ち手の状態から再び新しく○Xが記録され始めます。

 

 

 

 

 

↓3,Go to move #2 を押し、過去の9マス状態#2に戻る

 

 

 

 

 

↓ 過去の9マス状態#2から新たに○Xをつけ、ゲーム再開。

 

 

 

といった流れでした!!

 

 

 

 

以上でReactのチュートリアルは一通り終わりました!!

続いて次回からReduxのチュートリアルをやりながら知見をまとめていこうと思います!!