setState映射函数中对象的一种状态

时间:2018-10-17 10:44:15

标签: javascript reactjs react-native components react-component

我已经处理了两天了。无法在线找到解决方案,这时我认为我做错了事。

因此,此应用程序的重点是单击按钮并放一个苹果。单击该按钮会更改组件中树的状态和类名,从而使其摇动。其余部分由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的苹果并将其状态更改为“掉落”。

能否请您逐步介绍一下我的工作方式或为我指出一些有关工作方式的确切资源。

2 个答案:

答案 0 :(得分:1)

您没有正确更新状态。您应该将整个更新后的对象返回到setState

{{1}}

答案 1 :(得分:0)

在dropApples上,将随机苹果的状态设置为下降

this.setState({
    apples: this.state.apples.map(
        apple => apple.id === random ? { ...apple, status: 'falling' } : apple
})

顺便说一句:setState是异步的,因此当您多次调用setState时,它可能尚未提交上一个调用,因此会导致不一致。