gpt4 book ai didi

javascript - React 未在子组件中显示更新状态

转载 作者:行者123 更新时间:2023-12-03 04:32:10 25 4
gpt4 key购买 nike

这是 React tutorial 的改编版。我的目的是通过选择一两个玩家来迁移到自动 Action 的选择。在这个阶段,由于某种原因,没有选择方 block 在使用 this.setState({squares:this.state.squares, xIsNext: !this.state.xIsNext}) 语句调用 handleMove(i) 时捕获,可以看出Button 和 Square 组件中的两个 console.log 调用。

这是教程中采用的技术,所以我不确定为什么方形数组不是更新。我读过其他帖子和 Facebook 关于不变性的讨论,其中指出该函数(在本例中为handleMove(i),正确吗?)必须在状态更改之前完成体现在整体状态上。其他组件以及整个 DOM 中对 console.log 的调用不反射(reflect)方 block 上的点击。

谁能告诉我为什么这不起作用?谢谢。

关于JSBin

<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<title>Tic Tac Toe</title>
<script src="https://unpkg.com/react@latest/dist/react.js"></script>
<script src="https://unpkg.com/react-dom@latest/dist/react-dom.js"></script>
<script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div id='root'></div>
<script type='text/babel' >


function Square(props){
console.log(props.value);
return(
<button className="square" onClick={() => props.onClick()}>{props.value}</button>
);
}



class Board extends React.Component{
renderSquare(i){
console.log(this.props.squares);
return <Square value={this.props.squares[i]} onClick={() => this.props.onClick(i)} />
}

render(){
return(
<div className="board">
<div className="row">
{this.renderSquare(0)}
{this.renderSquare(1)}
{this.renderSquare(2)}
</div>
<div className="row">
{this.renderSquare(3)}
{this.renderSquare(4)}
{this.renderSquare(5)}
</div>
<div className="row">
{this.renderSquare(6)}
{this.renderSquare(7)}
{this.renderSquare(8)}
</div>
</div>
);
}
}


class Game extends React.Component{

constructor(props){
super(props);
this.state = {
onePlayerGame: true,
squares: Array(9).fill(null),
xIsNext: true
}
}

onePlayer(){
this.setState({onePlayerGame: true});
return(
document.getElementById('onePlayer').style.color = "yellow",
document.getElementById('twoPlayer').style.color = "black"
);
}


twoPlayer(){
this.setState({ onePlayerGame: false});
return(
document.getElementById('onePlayer').style.color= "black",
document.getElementById('twoPlayer').style.color= "yellow"
);

}

handleMove(i){
const squares = this.state.squares.slice();
squares[i] = this.state.xIsNext ? 'X':'O';


this.setState({
squares: this.state.squares,
xIsNext: !this.state.xIsNext
})
}



render(){
return(
<div id="main">
<div>
<button className="gameSelect" id="onePlayer" value={this.state.onePlayerGame} onClick={() => this.onePlayer()} >One Player</button>
<button className="gameSelect" id="twoPlayer"value={this.state.onePlayerGame} onClick={() => this.twoPlayer()} >Two Players</button>
</div>

<Board
squares={this.state.squares}
onClick={(i) => this.handleMove(i)} />

</div>
);
}
}



ReactDOM.render(
<Game />,
document.getElementById('root')
)



</script>
</body>
</html>

最佳答案

已捕获选择,但您未将 squares 的新值保存在 state 中。

这个

handleMove(i){
const squares = this.state.squares.slice();
squares[i] = this.state.xIsNext ? 'X':'O';


this.setState({
squares: this.state.squares, <----- You are not assigning the new value
xIsNext: !this.state.xIsNext
})
}

应该是

handleMove(i){
const squares = this.state.squares.slice();
squares[i] = this.state.xIsNext ? 'X':'O';


this.setState({
squares: squares,
xIsNext: !this.state.xIsNext
})
}

这是正确的jsbin

关于javascript - React 未在子组件中显示更新状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43443273/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com