我正在构建一个whack-a-mole应用程序,并且具有以下组件:
row
index
的随机数,用于显示痣从哪个孔弹出这将每行生成5个孔,并且带有随机生成的索引的孔将得到一个布尔值以标记是否有痣。
点击mole
时
Row
组件的状态。console.log()
表明它确实重新生成了一个随机数,并且与每个Hole
组件映射的变量也接收了新的,更新的Hole
组件,这些组件具有新索引以具有mole
。 挑战
初始渲染效果很好。痣位于随机的孔中,单击时痣会消失。
但是,没有mole
出现在新索引上,hole
组件也没有重新呈现,因为这些组件console.log()
都没有出现。
即使父母的状态发生了变化,holes
组的新道具也被重新渲染,为什么Hole组件从未真正运行?
更改孔号的方法在Row
组件中,并且还有用于容纳新组件的数量和变量。
所以我想问题可能出在Hole组件中。
class Rows extends Component{
state = { holeNum: null };
componentWillMount() {
this.changeSpot();
};
changeSpot = () => {
// console.log(this.state.holeNum);
let random = Math.floor(Math.random() * Math.floor(5));
this.setState({ holeNum: random });
// console.log("Spot changed ", this.state.holeNum, random)
}
render() {
// console.log("ROW ", this.props.id)
let holes = [0,1,2,3,4];
// console.log(this.state.holeNum)
let row = holes.map(idx => {
// if holeNum is equal to index has mole is true
// console.log("rerendering")
let moleRender = false;
if(this.state.holeNum === idx){
moleRender = true;
// console.log(idx, moleRender, this.state.holeNum)
};
return (
<Hole
changeSpot={this.changeSpot}
updateScore={this.props.updateScore}
hasMole={moleRender}
/>
);
});
// console.log(row)
return (
<div className="Row">
{row}
</div>
);
};
};
这是Hole
组件
class Hole extends Component{
state = { hasMole: false };
componentWillMount(){
// console.log("Comp will mount Hole")
if(this.props.hasMole===true){
// console.log(this.props.hasMole)
this.setState({hasMole:true});
};
};
moleClickedHandler = () => {
this.setState({ hasMole:false });
// this.props.updateScore()
this.props.changeSpot();
};
render() {
let mole = null;
if(this.state.hasMole === true){
// console.log(this.state.hasMole)
mole = <Mole clicked={this.moleClickedHandler} />;
};
return (
<div className="Hole">
{mole}
</div>
);
};
};
谢谢!
答案 0 :(得分:0)
我想您会在开发人员工具的控制台中收到一条与缺少“关键”道具有关的警告 您可以在此处进一步了解为什么需要密钥:https://reactjs.org/docs/lists-and-keys.html
您可以通过添加密钥来解决此问题
<Hole
key={ix}
changeSpot={this.changeSpot}
updateScore={this.props.updateScore}
hasMole={moleRender}/>