所以我现在正在学习react ,我一直在努力解决这个问题.. 我正在试着做井字游戏,所以我有这样的代码:

import './App.css';
import { useState } from "react"

const X = 1;
const O = -1;
const EMPTY = 0;

var Square = ({idx, click}) => 
{
    let [val, setVal] = useState(EMPTY);
    return (
        <button onClick={() => {click(setVal, idx);}}>{val}</button>
    )
}

var Logger = ({state}) =>
{
    return (
        <button onClick={() => {console.log(state);}}>log</button>
    )
}

var App = () =>
{
    let [turn, setTurn] = useState(X);
    let state = new Array(9).fill(EMPTY);
    let squares = new Array(9);

    let click = (setValFunc, idx) => 
    {
        setTurn(-turn);
        setValFunc(turn);
        state[idx] = turn;
    }

    for (let i = 0 ; i < 9 ; i++)
    {
        squares[i] = (<Square click={click} idx={i}/>);
    }

    return (
        <>
        <Logger state={state} />
        <div>
            {squares}
        </div>
        </>
    )
}

export default App;

因此,当我单击这些方块时,它们会发生变化,但当我单击LOG按钮将状态数组记录到控制台时,状态数组仍为全零.

我错过了什么吗?

推荐答案

你的状态必须再次达到react state.否则,您在App中定义为局部变量的状态只会持续到下一次重现.

  1. useState个钩子内保持tic-tac-toe状态
let [state, setState] = useState(new Array(9).fill(EMPTY));
  1. 相应地更新点击处理程序.
  let click = (setValFunc, idx) => {
    setTurn(-turn);
    setValFunc(turn);
    setState((prevState) =>
      prevState.map((item, index) => (index === idx ? turn : item))
    );
  };

Edit agitated-mountain-cfu7o3

Javascript相关问答推荐

无法将nPM simplex-noise包导入在JS项目中工作

为什么从liveWire info js代码传递数组我出现错误?

如何在Angular中插入动态组件

google docs boldText直到按行执行应用脚本错误

如何在Javascript中使用Go和检索本地托管Apache Arrow Flight服务器?

VUE 3捕获错误并呈现另一个组件

如何将多维数组插入到另一个多维数组中?

rxjs插入延迟数据

如何在ASP.NET项目中使用Google Chart API JavaScript将二次轴线值格式化为百分比

禁用.js文件扩展名并从目录导入隐式根index.js时,找不到NodeJS导入模块

如何在箭头函数中引入or子句?

为什么我的按钮没有从&q;1更改为&q;X&q;?

背景动画让网站摇摇欲坠

Django导入问题,无法导入我的应用程序,但我已在设置中安装了它

Next.js无法从外部本地主机获取图像

如果NetSuite中为空,则限制筛选

JavaScript将字符串数字转换为整数

Promise.race()返回已解析的promise ,而不是第一个被拒绝的promise

JS/css:将数字输入的S函数和可调整大小的元素S函数绑定在一起

对象作为react 子对象无效(已找到:具有键的对象{type,props}).如果要呈现一个子级集合,请改用数组