Javascript (React_基本的なこと01)

■三目並べのサンプルをいじる。
公式のHPにのっていた三目並べのコードを修正して、メソッドの意味とか確認している。公式ページにボタンのサンプルもあったので、それも使って下のようなものに修正した。ボタンを押すとクリック数が増えて、ある数から四角の枠の中に'X'を表示させる。また枠内をクリックすると'O'が表示される。

状態を保つためには、useState というAPI が必要。
import { useState } from 'react'; としてインポート。
下のコードのように、useState から変数と関数が作られる(squares と setSquares)。枠内をクリックすると、handleClickが呼び出され、それらにふられた番号(i)に応じた場所に'O'が入力される。

    const [squares, setSquares] = useState(Array(3).fill(null));

    function handleClick(i) {
        const nextSquares = squares.slice(); 
        nextSquares[i] = 'O';
        setSquares(nextSquares);
    }

コード全体を一番下に示すけど、src/App.js の中身になる。実行自体は、コマンドプロンプトから package.json があるフォルダへ行き、npm start でlocalhostのブラウザを立ち上げる。package.json から /src/index.js が呼び出され、さらに index.js から SampleApp_user01 を呼び出している。SampleApp_user01 から Square, MyButton への参照という構成。


Visual Studioでコード編集。


App.jsコード。

import { useState } from 'react';

function Square({ value, onSquareClick }) {
    return (
        <button className="square" onClick={onSquareClick}>
            {value}
        </button>
    );
}


function MyButton({ aaa }) {
    const [count, setCount] = useState(0);
    function handleClick() {
        setCount(count + 1);
        if (count < 5) {
            aaa(2, 'X');
        } else if (count < 10) {
            aaa(1, 'X');
        } else {
            aaa(0, 'X');
        }
    }
    return (
        <button onClick={handleClick}>
            Clicked {count} times
        </button>
    );
}

export default function SampleApp_user01() {

    const [squares, setSquares] = useState(Array(3).fill(null));

    function handleClick(i) {
        const nextSquares = squares.slice(); 
        nextSquares[i] = 'O';
        setSquares(nextSquares);
    }

    return (
        <div className="c1">
            <div className="game-info">
                <div className="board-row">
                    <Square value={squares[0]} onSquareClick={() => handleClick(0)} />
                    <Square value={squares[1]} onSquareClick={() => handleClick(1)} />
                    <Square value={squares[2]} onSquareClick={() => handleClick(2)} />
                </div>
                <MyButton
                    aaa={(index, newValue) => {
                        const nextSquares = squares.slice();
                        nextSquares[index] = newValue;
                        setSquares(nextSquares);
                    }} />
            </div>
        </div>
    );
}