【问题标题】:Reaching new state in React (Hooks)在 React (Hooks) 中达到新的状态
【发布时间】:2023-03-08 18:22:01
【问题描述】:

我有一个小型井字游戏,一切都很好,除了我正在努力寻找在代码中放置完成功能的位置。让我给你看;


import React, { useState } from "react";
import { isGameOver } from "../Helper/helper";
import Square from "./Square";

const Board: React.FC = () => {
  const [squares, setSquares] = useState(new Array(9).fill(""));
  const [activePlayer, setActivePlayer] = useState("Player 1");
  const [winner, setWinner] = useState<any>();

  const clickSquare = (id: number): void => {
    if (!squares[id]) {
      if (activePlayer === "Player 1") {
        setActivePlayer("Player 2");
      } else {
        setActivePlayer("Player 1");
      }
    }
    setSquares((prevSquares) => {
      return prevSquares.map((square, i) => {
        if (i === id && !square) {
          square = activePlayer === "Player 1" ? "X" : "O";
        }
        return square;
      });
    });
  };

  return (
    <div className="board">
      <div className="game-field">
        {squares.map((square, i) => {
          return (
            <Square clickSquare={clickSquare} square={square} key={i} i={i} />
          );
        })}
      </div>
      <p
        style={{
          marginRight: activePlayer === "Player 1" ? "250px" : "-250px",
        }}
      >
        {activePlayer + "'s turn"}
      </p>
      <p> </p>
    </div>
  );
};

export default Board;


这基本上是整个游戏,我在另一个像这样的文件中有一个整理功能;

export const isGameOver = (squares: String[]) => {
  const won = [
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8],
    [0, 3, 6],
    [1, 4, 7],
    [2, 5, 8],
    [0, 4, 8],
    [2, 4, 6],
  ];
  for (let i = 0; i < won.length; i++) {
    const [x, y, z] = won[i];
    if (squares[x] && squares[x] === squares[y] && squares[y] === squares[z]) {
      return squares[x];
    }
  }
  return null;
};


完成功能也可以正常工作,但是由于 useState 正在异步工作并且我知道,所以我正在努力将它放在哪里。如果我把点击功能放在里面,它就不能反应新的状态,只能反应之前的状态。如果我只用 If 语句放在外面,它会说渲染太多,因为我正在设置获胜者等。我的意思是我还想停止游戏,停止点击事件等。找不到如何实现这一点的方法.

【问题讨论】:

    标签: javascript reactjs react-hooks


    【解决方案1】:

    看来你需要useEffect。基本上,每次点击一个方块,检查游戏是否结束:

    useEffect(() => {
     if(squares){
       if(isGameOver(squares)){
         setSquares(null)
         /* Do other stuff */
       }
     }
    }, [squares])
    

    通过将squares 传递给依赖数组,您告诉react 您希望每次squares 状态变量更改时都运行此useEffect。你可以read more这里

    【讨论】:

    • 我不知道为什么我没有考虑 useEffect.. 谢谢,非常感谢。
    • 没问题,愉快的编码
    猜你喜欢
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多