React示例游戏的完善1 | 青训营笔记

59 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 3 天 React.js 示例游戏的完善

在完成基本的鼠标操作后 我们进行了状态提升

每个 Square 组件都维护了游戏的状态。我们可以把所有 9 个 Square 的值放在一个地方,这样我们就可以判断出胜者了。

目前的几个问题:

  1. 组件的state?其可行性为什么不行?

    答:我们希望 Square 组件可以“记住”它被点击过,然后用 “X” 来填充对应的方格。我们用 state 来实现所谓“记忆”的功能。

    可以通过在 React 组件的构造函数中设置 this.state 来初始化 state。this.state 应该被视为一个组件的私有属性。我们在 this.state 中存储当前每个方格(Square)的值,并且在每次方格被点击的时候改变这个值。

  2. state提升是什么?

    React官方文档如是说:

    当你遇到需要同时获取多个子组件数据,或者两个组件之间需要相互通讯的情况时,需要把子组件的 state 数据提升至其共同的父组件当中保存。之后父组件可以通过 props 将状态数据传递到子组件当中。这样应用当中所有组件的状态数据就能够更方便地同步共享了。

    关于具体的概念 待我查询

  3. 构造函数在react中的作用?

class Board extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      squares: Array(9).fill(null),
    };
  }
​
  renderSquare(i) {
    return <Square value={i} />;
  }

这段代码可见 constructor 作为声明数组的形式来使用

问题:this.state的功用看来是一个对象 JS方法:squares:Array9.fill(null)

结论:react可使用js方法用法看来更加灵活

 renderSquare(i) {
    return <Square value={i} />;
  }

我们依次使把 0 到 8 的值通过 prop 从 Board向下传递,从而让它们显示出来。

我们根据Square自身内部的state ,使用了 “X” 来代替之前的数字。因此,Square 忽略了当前从 Board 传递给它的那个 value prop。

我们再一次使用 prop 的传递机制。我们通过修改 Board 来指示每一个 Square 的当前值('X', 'O', 或者 null)。

我们在 Board 的构造函数中已经定义好了 squares 数组,这样,我们就可以通过修改 Board 的 renderSquare 方法来读取这些值了。

  renderSquare(i) {
    return <Square value={this.state.squares[i]} />;  }

通过这样,每个 Square 就都能接收到一个 value prop 了,这个 prop 的值可以是 'X''O'、 或 nullnull 代表空方格)。

Class Square 内部的state

      <button className="square" onClick={function() { alert('click'); }}>