2
votes

Comment utiliser correctement les méthodes shouldComponentUpdate () et componentWIllUpdate () dans ReactJs?

Avant, j'utilisais componentWillReceiveProps pour mettre à jour mon objet local de composant après avoir obtenu des données de redux.

shouldComponentUpdate(nextProps, nextState){
    if (nextProps.editUser && !nextProps.loading && !isEqual(this.state.user, nextProps.editUser)){
      return true;
    }
    return false;
}

componentWillUpdate(nextProps, nextState) {
    if (nextProps.editUser && !nextProps.loading && !isEqual(this.state.user, nextProps.editUser)){
        this.setState({user:{
          name:nextProps.editUser.name,
          email:nextProps.editUser.email,
        }}, function(){
          this.setState({addModalUserEdit:true});
        });
    }
}

Mais maintenant je veux utiliser shouldComponentUpdate et componentWillUpdate comme dans la documentation de réaction selon le cycle de vie de réaction.

componentWillReceiveProps(nextProps) {
    if (nextProps.editUser && !nextProps.loading && !isEqual(this.state.user, nextProps.editUser)){
        this.setState({user:{
          name:nextProps.editUser.name,
          email:nextProps.editUser.email,
        }}, function(){
          this.setState({addModalUserEdit:true});
        });
    }
}

mais je génère une erreur comme

"Profondeur de mise à jour maximale dépassée. Cela peut se produire lorsqu'un composant appelle à plusieurs reprises setState dans le composantWillUpdate ou componentDidUpdate. React limite le nombre de mises à jour imbriquées à éviter les boucles infinies. "

Veuillez m'indiquer ce que je fais de mal pour comprendre le cycle de vie des réactions.

Merci d'avance.


0 commentaires

3 Réponses :


0
votes

shouldComponentUpdate est exécuté avant la mise à jour de l'état ( et c'est pourquoi il vous donne le nextState en tant que propriété ). testez par rapport à l ' état dont vous avez besoin pour utiliser nextState.

shouldComponentUpdate(nextProps, nextState){
    if (nextProps.editUser && !nextProps.loading && !isEqual(nextState.user, nextProps.editUser)){
      return true;
    }
    return false;
}

Gardez à l'esprit que c'est a conseillé de ne pas effectuer de vérifications d'égalité profonde dans shouldComponentUpdate car cela nuirait aux performances.

De plus, le componentWillUpdate est ( dans les versions récentes ) appelé UNSAFE_componentWillUpdate et il indique

Notez que vous ne pouvez pas appeler this.setState () ici; tu ne devrais pas non plus faire toute autre chose (par exemple, envoyer une action Redux) qui déclencherait un mise à jour vers un composant React avant UNSAFE_componentWillUpdate () retourne.


La méthode suggérée est d'utiliser le componentDidUpdate .


5 commentaires

J'utilise la version React 16.02 et comment puis-je empêcher la mise à jour de l'état local


qu'est-ce que nextState dans ces fonctions?


@ hu7sy oublie mon dernier commentaire. Il n'est pas autorisé d'utiliser setState dans le componentWillUpdate comme je l'ai mentionné dans ma réponse. Pouvez-vous me dire pourquoi la solution initiale que vous aviez avec componentWillReceiveProps n'est plus suffisante?


je ne dis pas que ce n'est plus suffisant, j'étais curieux d'utiliser le cycle de réaction comme il se doit


et quelle est la meilleure approche pour ne pas restituer les valeurs tout le temps, supposons que j'ai une valeur pour l'objet utilisateur qui sera dans l'état redux et je veux éviter de mettre à jour l'état local tout le temps



0
votes

shouldComponentUpdate () est appelé avant le rendu lorsque de nouveaux accessoires ou état sont reçus.

  shouldComponentUpdate (nextProps) {
     return nextProps !== this.props
  }

componentDidUpdate () est appelé immédiatement après l'état de mise à jour.

Les deux méthodes ne sont pas appelées pour le rendu initial.


0 commentaires

0
votes

shouldComponentUpdate permet de décider que les changements dans les accessoires ou l'état ont affecté la sortie du composant ou non.

componentDidUpdate sera déclenché lorsqu'il y aura une mise à jour sur la sortie du composant.

shoudComponentUpdate prend 2 arguments, nextProps et nextState . qui contient une nouvelle mise à jour des accessoires et de l'état. et renvoyer un booléen.

 entrez la description de l'image ici


1 commentaires

quelle est la meilleure approche pour ne pas restituer les valeurs tout le temps, supposons que j'ai une valeur pour l'objet utilisateur qui sera dans l'état redux et je veux éviter de mettre à jour l'état local tout le temps