React入门 4: 重构 [抬起篇]

首先

我希望通过多次的文章使用React来开发井字游戏 (即三子棋),这样既可以对自己进行复习,也可作为备忘录的意义。

    • React

 

    • CodeSandbox(公式)

 

    CodeSandbox(非公式)

系列清单

    1. React入门1:环境搭建[在线版]

 

    1. React入门1.5:环境搭建[本地版-番外篇]

React入门2:棋盘的创建
React入门3:交互操作的实现
React入门4:重构[提升状态篇](此次)
React入门5:重构[交互操作篇]
React入门6:实现轮次
React入门7:游戏胜利判定
React入门8:实现文本
React入门9:时间旅行(1)
React入门10:时间旅行(2)
React入门11:时间旅行(3)

关于目的的问题

整体的目标

我们将使用3×3的方格来实现在React公式教程中公开的井字游戏。

 

这次的目标是什么?

为了进行游戏胜利判定,我们将通过更改程序来使得我们能够通过Board组件了解每个格子的状态。

重构

重构(Refactoring)是指以下几个意思。

    • プログラムに機能を追加すること

 

    ソースコードを管理しやすいものへと修正すること

您可以在下一页上查看上次的源文件。

 

    前回の内容はコチラから!

 

管理组件用于管理马斯的状态。

在这里,我们将回顾当前的程序。

Board コンポーネントと Square コンポーネントは親子関係にある (第2回の記事を参照)

Board コンポーネントが9つの Square コンポーネントを呼び出している

9つのマスの状態は Square コンポーネントによってそれぞれ制御されている

マスの状態は state 型の value 変数が示す

为了判断胜利条件是否成立,需要获取棋盘即所有方格的状态。因此,我们将改变程序,使方格的状态能够在父组件的棋盘组件中进行管理。这种重构被称为提升。

为了提升面具的状态,让我们在App.js中进行以下更改。

Square コンポーネントの変更

state 型の value 変数を削除する
プロパティとして value を追加する

handleClick() 関数を削除する

Board コンポーネントの変更

state 型の squares 配列を宣言する

配列の要素数は9個とし、各要素の初期値は null とする

setSquares という関数を呼び出すと squares 配列を更新できるようにする

各 Square コンポーネントの value プロパティに squares 配列の要素を渡す

import { useState } from "react";
import "./styles.css";

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

export default function Board() {
  const [squares, setSquares] = useState(Array(9).fill(null));

  return (
    <>
      <div className="board-row">
        <Square value={squares[0]} />
        <Square value={squares[1]} />
        <Square value={squares[2]} />
      </div>
      <div className="board-row">
        <Square value={squares[3]} />
        <Square value={squares[4]} />
        <Square value={squares[5]} />
      </div>
      <div className="board-row">
        <Square value={squares[6]} />
        <Square value={squares[7]} />
        <Square value={squares[8]} />
      </div>
    </>
  );
}

以下是操作的结果。由于在Square组件中进行了更改,删除了

image.png

举例说明提升效果

关于状态变量,下面列举了可能进行升级的场景。

    1. 当需要在子组件之间共享信息时

 

    当需要获取多个子组件的信息时

我用黑白棋来比喻各种场面。

リファクタリングの事例.jpg

另外,进行的井字游戏举起是为了”想要从多个Square组件获取方块的信息”,因此属于第二个场景。在这种情况下,可以在父组件中声明状态变量或数组,并在调用子组件时通过属性传递信息。

最后

这次我们修改了代码,使得我们可以在 Board 组件中管理棋盘的状态。下一页展示了当前阶段的源代码文件。

 

下一次,我们将重新实施在这次的重构中丢失的鼠标点击交互。

 

广告
将在 10 秒后关闭
bannerAds