2017-08-09 1 views
0

Je construis un petit jeu avec React et je suis prêt à inclure un compte à rebours.Réagissez-- Le chronomètre commence à compter les secondes en un clic de bouton

Il existe de nombreux didacticiels (dont un dans la documentation officielle de React) sur la façon de créer un minuteur ou un compte à rebours avec React. Tous utilisent cependant les méthodes de cycle de vie componentDidMount et componentWillUnmount pour définir et effacer respectivement l'intervalle.

Cela fonctionne correctement, mais la minuterie commence à compter le moment où le composant est monté. Je voudrais avoir une minuterie qui commence à compter surClick. Quelles sont les méthodes de cycle de vie appropriées pour réaliser un tel comportement?

J'ai déjà essayé componentWillUpdate et componentDidUpdate mais sans aucun effet. Ma première pensée était d'utiliser une propriété gameOn afin d'activer la minuterie seulement quand le jeu est activé (c'est-à-dire que le bouton de démarrage a été enfoncé) mais cela n'a pas fonctionné parce que je devine gameOn à true , longtemps après le composant didMount.

J'ai également essayé de déplacer ces deux méthodes avec l'état approprié ({secondsElapsed: 0}) sur le composant Timer, puisque Timer est un composant séparé qui communique avec son parent à travers les accessoires. Cela aussi n'avait pas de chance.

Enfin, j'ai essayé de définir this.interval = null; sur ma fonction de constructeur, mais cela n'avait aucune différence sur le fonctionnement du temporisateur.

Je pense que la racine du problème est les méthodes du cycle de vie, car celles-ci contrôlent quand setInterval et clearInterval seront appelés. Donc ma question est la suivante:

Quelle autre combinaison de méthodes de cycle de vie dois-je utiliser pour obtenir le comportement que je suis après?

Toute suggestion bien comprise sera appréciée.

Points bonus si vous pouvez expliquer en termes clairs pourquoi et quand dois-je déclarer this.interval = null; sur ma fonction constructeur.

Pour un exemple de ce que j'ai jusqu'à présent, regardez vraiment essentiellement à la « A Stateful Component »

+1

Vous pouvez toujours commencer un intervalle comme vous voulez juste ne pas oublier de les effacer. En réagissant au cycle de vie, le meilleur endroit pour nettoyer les choses est 'componentWillUnmount'. Pourquoi? Parce que vous voulez être sûr que l'intervalle est effacé tout le temps. – Jalil

+0

Attendez, n'est-ce pas le cas avec componentDidUpdate? – alexandros84

+0

ce ne serait pas un endroit idéal pour le mettre car il y a beaucoup de facteurs qu'un composant met à jour. Vous voulez probablement qu'il soit déclenché/effacé par un événement (onClick) ou lors du démontage. – Jalil

Répondre

3
componentWillUnmount() { 
    clearInterval(this.interval); // Always clean up before unmounting 
} 

render(){ 
    <div> 
    <button 
     onClick={() => { this.interval = setInterval(() => { 
     // Do something here e.g. increment the time 
     // NOTE: `this` keyword here refers to the component itself 
     }, 1000); }}> 
     Start 
    </button> 
    </div> 
} 
+0

Le problème ici est que la fonction onClick est sur le composant parent, mais je voudrais me référer au composant Timer quand il s'agit de componentWillUnmount() ... J'ai quatre composants (main, start, action et timer). main est le parent de start et lance le parent de l'action et du timer. – alexandros84

+0

Pouvez-vous expliquer plus en détail quelles propriétés vous accédez, où doit-on y accéder et d'où? –

+0

Cela a réellement fonctionné. Je ne savais pas qu'il était possible de définir this.interval à partir de la fonction onClick. J'aurais dû y penser mais cette insistance sur les tutoriels pour l'utiliser avec les méthodes du cycle de vie m'a désorienté. Gloire! – alexandros84