Javascript 为什么setState()不';是否在React上更新渲染?
我正在尝试制作一个2D游戏板,它由一个名为Javascript 为什么setState()不';是否在React上更新渲染?,javascript,node.js,reactjs,Javascript,Node.js,Reactjs,我正在尝试制作一个2D游戏板,它由一个名为isAlive的二进制状态值“Cells”组成。用户可以通过单击来更改此值。此值使用不同的颜色指示给用户。Board.js构造函数使用false值创建每个单元格。 电路板上还有一个“重置”按钮,用于将所有单元重置回false 单击单元格时,单元格的值会正确更改。单击“重置”按钮时,我希望每个单元格的isAlive值为false。但是,当视觉上按下“重置”按钮时,电路板上没有变化(电池的颜色没有变化)。console.log(this.state.cell
isAlive
的二进制状态值“Cells”组成。用户可以通过单击来更改此值。此值使用不同的颜色指示给用户。Board.js
构造函数使用false
值创建每个单元格。
电路板上还有一个“重置”按钮,用于将所有单元重置回false
单击单元格时,单元格的值会正确更改。单击“重置”按钮时,我希望每个单元格的isAlive
值为false
。但是,当视觉上按下“重置”按钮时,电路板上没有变化(电池的颜色没有变化)。console.log(this.state.cells)Board.js上的handleClick()
method上的code>line为所有单元格打印props:Object{isAlive:false}
。那么,为什么单元格的更新不直观呢?我做错了什么
Board.js
export default class Board extends React.Component {
constructor(props) {
super(props);
this.state = {
cells: []
};
this.rowNum = 10;
this.colNum = 10;
for (let i = 0; i < (this.rowNum * this.colNum); i++) {
this.state.cells.push(<Cell isAlive={false}/>);
}
this.handleClick = this.handleClick.bind(this);
this.getCols = this.getCols.bind(this);
}
getCols() {
let cols = [];
for (let i = this.rowNum; i <= (this.rowNum * this.colNum); i += this.rowNum) {
cols.push(this.state.cells.slice(i - this.rowNum, i).map(function (item, i) {
return <div key={i}>{item}</div>
}));
}
return cols;
}
handleClick() {
const newBoard = this.state.cells;
newBoard.forEach((item, index, arr) => {
arr[index] = <Cell isAlive={false}/>
});
this.setState({
cells: newBoard
}, function () {
console.log(this.state.cells);
}
);
}
render() {
return (<div className="background">
<table className="gameBoard">
<tbody>
<tr>
{this.getCols().map(function (item, index) {
return <td className="col" key={index}>{item}</td>
})}
</tr>
</tbody>
</table>
<button onClick={this.handleClick}> Reset</button>
</div>
);
}
}
导出默认类板扩展React.Component{
建造师(道具){
超级(道具);
此.state={
单元格:[]
};
this.rowNum=10;
this.colNum=10;
for(设i=0;i<(this.rowNum*this.colNum);i++){
this.state.cells.push();
}
this.handleClick=this.handleClick.bind(this);
this.getCols=this.getCols.bind(this);
}
getCols(){
设cols=[];
for(让i=this.rowNum;i{
arr[索引]=
});
这是我的国家({
单元:新板
},函数(){
console.log(this.state.cells);
}
);
}
render(){
返回(
{this.getCols().map(函数(项,索引){
返回{item}
})}
重置
);
}
}
Cell.js的重要部分包括:
export default class Cell extends React.Component {
constructor(props) {
super(props);
this.colors = {
dead: '#041b40',
alive: '#b2e8f7',
hover_dead: '#495d76',
hover_alive: '#e6fffd'
};
this.state = {
isAlive: this.props.isAlive,
isMouseDown: false,
isHovering: false
};
this.handleClick = this.handleClick.bind(this)
}
handleClick() {
this.setState({
isAlive: !this.state.isAlive,
isMouseDown: this.state.isMouseDown,
isHovering: this.state.isHovering
})
}
...
determineColor() {
if (this.state.isAlive && this.state.isHovering) {
return this.colors.hover_alive;
} else if (!this.state.isAlive && this.state.isHovering) {
return this.colors.hover_dead;
} else if (this.state.isAlive && !this.state.isHovering) {
return this.colors.alive;
}else {
return this.colors.dead;
}
}
render() {
return (
<div>
<button className='square'
onClick={this.handleClick}
type='button'
style={{
backgroundColor: this.determineColor()
}}>
</button>
</div>
)
};
}
导出默认类单元格扩展React.Component{
建造师(道具){
超级(道具);
此项。颜色={
死亡:“#041b40”,
活动:“#b2e8f7”,
悬停死亡:“#495d76”,
活动悬停:“#e6fffd”
};
此.state={
isAlive:this.props.isAlive,
isMouseDown:错,
isHovering:错
};
this.handleClick=this.handleClick.bind(this)
}
handleClick(){
这是我的国家({
isAlive:!this.state.isAlive,
isMouseDown:this.state.isMouseDown,
Ishoring:这个州
})
}
...
确定颜色(){
if(this.state.isAlive&&this.state.isHovering){
将此.colors.hover\u活动返回;
}如果(!this.state.isAlive&&this.state.isHovering),则为else{
返回此.colors.hover\u dead;
}else if(this.state.isAlive&!this.state.isHovering){
返回此.colors.alive;
}否则{
归还这个。颜色。死亡;
}
}
render(){
返回(
)
};
}
您需要在道具更改时更新内部状态:
导出默认类单元格扩展React.Component{
建造师(道具){
超级(道具);
此项。颜色={
死亡:“#041b40”,
活动:“#b2e8f7”,
悬停死亡:“#495d76”,
活动悬停:“#e6fffd”
};
此.state={
isAlive:this.props.isAlive,
isMouseDown:错,
isHovering:错
};
this.handleClick=this.handleClick.bind(this)
}
componentDidUpdate(prevProps,prevState){/您必须使用componentDidUpdate
componentDidUpdate(prevProps) {
if (this.props.isAlive!== prevProps.isAlive) {
this.setState({isAlive: this.props.isAlive})
}
}
您不需要将单元组件保留为板组件的状态。您应该只保留阵列中单元的活动状态。谢谢您的回答!当我第一次单击按钮时,您和zahra的回答都很好。但是,当我第二次单击按钮时,它不会再次在视觉上更新。这是为什么?哟你的点击功能总是设置为false,那么为什么会发生任何变化呢?我在第二次重置之前点击了一些单元格的isAlive值,将它们更改为“true”。这些单元格在按下重置按钮后仍然保持“true”。也许这个链接将帮助你将状态更改为true和false