はじめに
こんにちわ、swim-loverです。 初心者向けのWebアプリ開発記事です。フロントエンド環境にReact.jsを使用しています。今の目標は、出席簿アプリを作ることです。
第3回は、 ReactのDebug環境である、 React DevTools の導入を行いました。
今回も引き続き ‘CodePen’に保存したProject 三つ並べゲーム ‘My Tic Tac Toy’のサンプルを使って、勉強したいと思います。
React Code “9個のStateの管理”
チュートリアルに従いすすめます。第二回で、Squreクラスに、State変数を導入しました。変数の数はSqure数分で9個です。今回は、それぞれのSqureの状態を1箇所で管理できるようにすることです。
あるSqureから隣のSqureへStateを問い合わせるようにプログラムをすることもできると思いますが、考えただけでも複雑になることは間違いありません。
そこで、親のBoardクラスでそれぞれのSqureのStateを管理し、必要に応じて、それぞれのSqureへStateを通知すれば、効率的で美しいコードが書けそうです。
Boardクラスのコンストラクタを追加し、ここに、配列型の変数squresを定義して、’null’で初期化しています。
class Board extends React.Component {
constructor(props) { //constructor
super(props); //call super class
this.state = { //init state val
squares: Array(9).fill(null),
};
}
renderSqure()メソッドも、数字’i’を各Squreクラスに渡していましたが、これを、State “state.squres[i]”を渡すように変更します。現時点では、”null”が入っているsquares[]の値を渡しています。
renderSquare(i) {
// return <Square value={i} />;
return <Square value={this.state.squares[i]} />;
}
コードの更新がさらに続きます。マス目がクリックされたときに、Stateを書き換える必要があります。
マス目のクリックの検出は、それぞれのSqureクラスにて検出され、Stateは親クラスのBoardで管理しているので、工夫が必要になります。
renderSqure()メソッドをさらに書き換えます。何だか急に難しく感じてきました。マウスクリック時に、this.handleClick(i)を呼んでもらうようにするコード(コールバック関数)だと思います。
しかし、現時点では、handleClick()関数は出てきていません。チュートリアルでは、handleClick()関数を実装しないで、先に進みますが、ここで、空の関数だけでも用意しておきたいと思います。
今回は、handlClick()関数は、開発者コンソール画面に、”hdl-click”を表示するようにしました。
renderSquare(i) {
// return <Square value={i} />;
// return <Square value={this.state.squares[i]} />;
return( <Square
value={this.state.squares[i]}
onClick={() => this.handleClick(i)}
/>);
}
handleClick(i) {//call back function
console.log('hdl-click')
}
次にSqureクラスの変更です。
Squreクラスのコンストラクターの削除。Squreクラスでstate管理は行わないため、初期化が不要になりました。複数行のコメントアウトは、/* */で行いました。
マウスクリックハンドラの変更 onClick={() => this.setState({value: ‘X’})}> を onClick={() => this.props.onClick()}> に変更。this.props.onClick()は、Boardクラスで渡されたhandleClick(i)関数と理解しています。
class Square extends React.Component {
/*
constructor(props) { //constructor
super(props); //call super class
this.state = { //init state val
value: null,
};
}
*/
/*
return (
<button
className="square"
onClick={() => this.setState({value: 'X'})}>
{this.state.value}
</button>
);
*/
render() {
return (
<button
className="square"
onClick={() => this.props.onClick()}>
{this.props.value}
</button>
);
}
}
React Code “handleClick()関数の実装”
空の関数にしていたhandleClick()関数の実装を行います。
.slice()は、データを切り取るメソッドとのことです。引数なしで、slice()を使うと、squres[]のコピーを作成する処理になります。
コピーしたsquares[]に対して、’X’を設定していますね。変更後のsquares[]を、元のsqures[]にコピーしています。このようにするメリットは、後々出てくるのだと考えられます。
まとめると、マウスクリック処理で、SqureクラスからBoardクラスのStateを書き変えています。
handleClick(i) {
console.log('hdl-click')
const squares = this.state.squares.slice();
squares[i] = 'X';
this.setState({squares: squares});
}
処理結果は、第二回の結果を変わりませんが、クラスの実装がかなり変わりました。

まとめ
今回、Boardクラスでの変数State管理、イベントハンドラによるSquareクラスからのBoardクラス変数stateの更新を行いました。
今後、不足している知識もどんどん出てくると思いますので、適宜、補いながら、Reactの勉強を進めたいと思います。

組み込み系ソフトエンジニアをしています。これまでフロントエンド技術は避けてきましたが、食わず嫌いをやめて、勉強を始めました。
趣味は、水泳、ロードバイク、ランニング、登山です。
組み込み系技術ネタ、勉強したフロントエンド技術、たまに趣味の運動について発信していきます。
どうぞよろしくお願いします。
コメント