【发布时间】:2022-02-06 08:51:58
【问题描述】:
我正在用 React 创建一个简单的井字游戏。
目标: 每个按钮都有自己的状态。单击按钮后,它应该将状态从“”切换到“X”,然后将玩家的全局状态更改为“玩家 2”。
问题: 它只是重新渲染 setPlayer() 调用,而不是 setValue() 调用。但是如果我摆脱 setPlayer() 并且只调用 setValue(),那么它会按预期工作。我需要 setStates 工作并重新渲染,以便在玩家名称更改时显示 X。
这是一个实时沙盒版本的链接 -
https://codesandbox.io/s/ticktacktoe-ozxjm?file=/src/App.js
import './App.css';
import { useState } from 'react';
function App() {
const player1 = "Player 1"
const player2 = "Player 2"
const [player, setPlayer] = useState(player1)
const WhosTurnMessage =()=>(
<div className='message'>
{player}, It's Your Turn
</div>
)
const Buttons =()=>{
const [value, setValue] = useState()
const checkAndSet =()=>{
if (player === player1){
setValue('X')
setPlayer(player2)
}
else {
setValue('O')
setPlayer(player1)
}
}
return (
<div className='grid-item'>
<button className='btn' onClick={()=>checkAndSet()} >
{value}
</button>
</div>
)
}
const MapButtons =()=>(
[1,2,3,4,5,6,7,8,9].map( i => <Buttons key={`button ${i}`}/>)
)
return (
<div className="App">
<header className="App-header">
<h1>
Tick Tack Toe
</h1>
</header>
<WhosTurnMessage />
<main>
<div className='grid-container'>
<MapButtons />
</div>
</main>
</div>
);
}
export default App;
【问题讨论】:
-
这是由于组件的父子关系。把所有组件分开,你的代码架构不好。
标签: javascript reactjs asynchronous setstate tic-tac-toe