我已经处理这个问题两天了。在网上找不到解决方案,目前我认为我做错了什么。
所以这个应用程序的重点是单击按钮并放下一个苹果。单击该按钮会更改组件中树的状态和类名,导致其晃动。 Sass 动画会完成剩下的工作。但我无法更改一个苹果的类名。因此,无法为一个苹果设置动画。我认为它只是改变了所有这些,而且它们有点相互重叠。这不是我想要的。
不知道我处理过程是否错误,但这是 app.js 的代码:
class App extends Component {
constructor(props){
super(props);
this.state = {
apples: [],
treeState: ''
}
}
componentWillMount(){
this.setState(
{
apples: [
{
id: '1',
status: 'present'
},
{
id: '2',
status: 'present'
},
{
id: '3',
status: 'present'
}
],
treeState: 'stagnant'});
}
render() {
return (
<div className="App">
<div className="App-header">
<img onClick={this.shakeTree.bind(this)} className="grab" alt="grab"/>
<Apples apples={this.state.apples}/>
<Tree treeState ={this.state.treeState}/>
</div>
</div>
);
}
shakeTree() {
var css = (this.state.treeState === "stagnant") ? "shaking" : "stagnant";
this.setState({"treeState":css});
this.dropApples();
}
dropApples(){
let apple;
var random = 2;
if(this.state.apples){
apple = this.state.apples.map(applemon => {
if(applemon.id==random){
this.setState(
{
apples: [
{
id: random,
status: 'falling'
}
]});
}
});
}
}
}
export default App;
我想要的是将其中一个苹果的状态更改为“下落”,而不影响其他苹果。例如,获取 id 为 2 的苹果并将其状态更改为“下落”。
您能否详细介绍一下我的操作方法,或者为我提供一些有关其操作方法的确切资源。
最佳答案
您没有正确更新状态。您应该将整个更新的对象返回给 setState
dropApples(){
let apple;
var random = 2;
if(this.state.apples){
this.setState(prevState => ({
apples: prevState.apples.map(apple => {
if (apple.id == random) return {...apple, status: 'falling'}
return apple
})
}))
}
}
关于javascript - setState 映射函数中对象的一种状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52853029/