Comment écouter les changements d'état dans react.js?

143

Quel est l' équivalent de la fonction $ watch angulaire dans React.js?

Je veux écouter les changements d'état et appeler une fonction comme getSearchResults ().

componentDidMount: function() {
    this.getSearchResults();
}
Eniz Gülek
la source

Réponses:

37

Je n'ai pas utilisé Angular, mais en lisant le lien ci-dessus, il semble que vous essayez de coder pour quelque chose que vous n'avez pas besoin de gérer. Vous apportez des modifications à l'état dans la hiérarchie de vos composants React (via this.setState ()) et React provoquera le nouveau rendu de votre composant (effectivement en «écoutant» les modifications). Si vous souhaitez `` écouter '' un autre composant de votre hiérarchie, vous avez deux options:

  1. Transmettez les gestionnaires (via des accessoires) d'un parent commun et demandez-leur de mettre à jour l'état du parent, ce qui entraîne le re-rendu de la hiérarchie sous le parent.
  2. Sinon, pour éviter une explosion de gestionnaires en cascade dans la hiérarchie, vous devez examiner le modèle de flux , qui déplace votre état dans les magasins de données et permet aux composants de les surveiller pour les changements. Le plugin Fluxxor est très utile pour gérer cela.
Edoloughlin
la source
3
Mais qu'en est-il lorsque vous devez récupérer des données distantes qui utilisent (une partie de) l'état en tant qu'URL / paramètre?
RnMss
@RnMss - regardez redux et réducteurs ( redux.js.org/docs/basics/Reducers.html ) et resélectionnez également ( github.com/reactjs/reselect ).
edoloughlin
320

Les méthodes de cycle de vie suivantes seront appelées lorsque l'état change. Vous pouvez utiliser les arguments fournis et l'état actuel pour déterminer si quelque chose de significatif a changé.

componentWillUpdate(object nextProps, object nextState)
componentDidUpdate(object prevProps, object prevState)
Derek Slager
la source
5
Avait besoin de déclencher une méthode lorsqu'une propriété dans un autre composant était mise à jour (une en haut via un rappel, une en bas via prop), et l'ajout componentDidUpdatedu composant avec l'accessoire était la bonne prescription. Merci pour cela.
Keith DC
Je pense que c'est la meilleure façon de garantir la notification des changements d'état, ce que le PO a demandé. Mais notez qu'aucune de ces méthodes ne se déclenchera après un changement d'état si vous opposez votre veto à la mise à jour dans shouldComponentUpdate.
MidnightJava
28
componentWillUpdateest obsolète: reactjs.org/blog/2018/03/27/update-on-async-rendering.html
Dmitry Minkovsky
1
ne componentDidUpdatepas tirer aussi lors de la réception de nouveaux accessoires, pas nécessairement juste au moment où les changements d'état?
andy mccullough
1
componentWillUpdateest obsolète.
sean le
29

Je pense que vous devriez utiliser ci-dessous le cycle de vie des composants comme si vous aviez une propriété d'entrée qui, lors de la mise à jour, doit déclencher la mise à jour de votre composant, alors c'est le meilleur endroit pour le faire car il sera appelé avant le rendu, vous pouvez même mettre à jour l'état du composant pour être réfléchi sur la vue.

componentWillReceiveProps: function(nextProps) {
  this.setState({
    likesIncreasing: nextProps.likeCount > this.props.likeCount
  });
}
hasain
la source
6
componentWillReceiveProps est obsolète: reactjs.org/docs/…
John Skoumbourdis
14

Depuis React 16.8 en 2019 avec useState et useEffect Hooks, les suivants sont désormais équivalents (dans des cas simples):

AngularJS:

$scope.name = 'misko'
$scope.$watch('name', getSearchResults)

<input ng-model="name" />

Réagir:

const [name, setName] = useState('misko')
useEffect(getSearchResults, [name])

<input value={name} onChange={e => setName(e.target.value)} />
Aprillion
la source
2

Utiliser useState avec useEffect comme décrit ci-dessus est une manière absolument correcte. Mais si la fonction getSearchResults renvoie un abonnement, useEffect doit renvoyer une fonction qui sera responsable de la désinscription de l'abonnement. La fonction retournée par useEffect s'exécutera avant chaque changement de dépendance (nom dans le cas ci-dessus) et lors de la destruction du composant

Shivang Gupta
la source
1

Cela fait un moment mais pour référence future: la méthode shouldComponentUpdate () peut être utilisée.

Une mise à jour peut être causée par des modifications apportées aux accessoires ou à l'état. Ces méthodes sont appelées dans l'ordre suivant lorsqu'un composant est en cours de rendu:

static getDerivedStateFromProps() 
shouldComponentUpdate() 
render()
getSnapshotBeforeUpdate() 
componentDidUpdate()

réf: https://reactjs.org/docs/react-component.html

Malvinka
la source
Vous devrez renvoyer un booléen à partir de, shouldComponentUpdatedonc il pourrait ne pas convenir à ce cas d'utilisation.
sean le