Comment utiliser l'opérateur d'incrémentation de Réagir

Pourquoi quand je fais this.setState({count:this.state.count*2}) cela fonctionne mais quand je fais: this.setState({count:this.state.count++}) ça ne marche pas?

Pourquoi, et comment le résoudre?

Code complet:

var Hello = React.createClass({
    getInitialState:function(){
    return {count:parseInt(this.props.count)}
  },
    a:function(){
    this.setState({count:this.state.count++})
    console.log(this.state)
  },
  render: function() {
    console.log(this.state)
    return <div onClick={this.a}>Click to increment the counter<b> {this.state.count} </b></div>;
  }
});

ReactDOM.render(
  <Hello count="1" />,
  document.getElementById('container')
);

Mais ce code fonctionne:

a:function(){
    this.setState({count:this.state.count*2})
    console.log(this.state)
  },

JSFiddle:https://jsfiddle.net/69z2wepo/55100/

16
demandé sur Seth 2016-09-04 14:23:13

5 réponses

En faisant this.state.count++, Vous muter l'état, parce que c'est la même chose que faire this.state.count += 1. Vous ne devez jamais la mutation de l'état (voir https://facebook.github.io/react/docs/component-api.html). Préférez le faire à la place:

this.setState({ count: this.state.count + 1 })
28
répondu Anthony Dugois 2016-09-04 11:44:18

setState est une fonction async. Réagir peut-lot un tas de setStates ensemble. Si la valeur de this.state.count est la valeur au moment où vous en faites la demande.

une meilleure solution pour appeler une fonction qui est évaluée au moment où le setState est exécuté.

this.setState((prevState, props) => ({
    counter: prevState.counter + 1
})); 

https://facebook.github.io/react/docs/state-and-lifecycle.html

17
répondu William Choy 2017-07-19 22:43:34

setState renvoie la fonction avant this.state.count est incrémenté parce que vous utilisez un opérateur post-fix (++). Aussi,setState est asynchrone, il accepte un callback comme second argument qui est déclenché lorsque l'État a été mis à jour, donc vous devez mettre votre console.log à l'intérieur du disjoncteur.

2
répondu Igorsvee 2016-09-04 11:32:45

vous essayez de muter l'état (accédez à ceci.état.champ et d'augmenter sa valeur), c'est ce que ++ est. Il essaie d'augmenter cette valeur d'état, et de l'attribuer à l'état neuf :) jamais muter état en appelant setState. Essayez

this.setState({count: this.state.count+1})

ou

this.setState({(state)=>({count: state.count + 1})}

// nouvelle variable d'État à l'intérieur de la portée de la fonction, nous pouvons jouer avec cela, ++ même en toute sécurité. mais ne l'appelez pas ++ sur ce.état jamais. En général, n'utilisez pas++, c'est une mauvaise pratique.

Pour de simples les affectations

a+=1 || a-=1 || a*=1 || a%=1  

sont meilleurs, ou même les écrivent explicitement.

 a = a + 1  
1
répondu Sandeep Ranjan 2017-12-13 12:44:51

j'ai trouvé une solution. Quand je fais this.setState({count:++this.state.count}) c'est le travail.

La raison est que quand je fais this.setState({count:this.state.count++}) la state.count valeur non envoyée à la setState fonction de réaction.

0
répondu Aminadav Glickshtein 2016-09-04 11:57:09