J'ai joué avec React et j'ai le composant temporel suivant qui Date.now()
s'affiche simplement à l'écran:
import React, { Component } from 'react';
class TimeComponent extends Component {
constructor(props){
super(props);
this.state = { time: Date.now() };
}
render(){
return(
<div> { this.state.time } </div>
);
}
componentDidMount() {
console.log("TimeComponent Mounted...")
}
}
export default TimeComponent;
Quelle serait la meilleure façon de mettre à jour ce composant toutes les secondes pour redessiner l'heure du point de vue React?
javascript
reactjs
flocon de neige
la source
la source
react-interval-rerender
Le code suivant est un exemple modifié du site Web React.js.
Le code original est disponible ici: https://reactjs.org/#a-simple-component
la source
updater
car elle ruine le cycle de mise à jour@Waisky a suggéré:
Si vous souhaitez faire la même chose, en utilisant Hooks:
Concernant les commentaires:
Vous n'avez rien à faire passer à l'intérieur
[]
. Si vous passeztime
entre parenthèses, cela signifie exécuter l'effet à chaque fois que la valeur detime
change, c'est-à-dire qu'il en invoque un nouveau àsetInterval
chaque fois,time
change, ce qui n'est pas ce que nous recherchons. Nous souhaitons n'appelersetInterval
qu'une seule fois lorsque le composant est monté, puissetInterval
appelersetTime(Date.now())
toutes les 1000 secondes. Enfin, nous invoquonsclearInterval
lorsque le composant est démonté.Notez que le composant est mis à jour, en fonction de la façon dont vous l'avez utilisé
time
, à chaque fois que la valeur destime
changements. Cela n'a rien à voir avec la misetime
en place[]
deuseEffect
.la source
[]
) comme deuxième argument àuseEffect
?Dans la
componentDidMount
méthode du cycle de vie du composant , vous pouvez définir un intervalle pour appeler une fonction qui met à jour l'état.la source
la source
Vous étiez donc sur la bonne voie. À l'intérieur de votre,
componentDidMount()
vous auriez pu terminer le travail en implémentantsetInterval()
pour déclencher le changement, mais rappelez-vous que la façon de mettre à jour l'état d'un composant est viasetState()
, donc à l'intérieur de vous,componentDidMount()
vous auriez pu faire ceci:De plus, vous utilisez
Date.now()
ce qui fonctionne, avec l'componentDidMount()
implémentation que j'ai proposée ci-dessus, mais vous obtiendrez un long ensemble de mises à jour de nombres désagréables qui ne sont pas lisibles par l'homme, mais c'est techniquement le temps de mise à jour toutes les secondes en millisecondes depuis le 1er janvier 1970, mais nous veulent rendre ce temps lisible à la façon dont nous, les humains, lisons le temps, donc en plus d'apprendre et de mettre en œuvre,setInterval
vous voulez en savoir plus surnew Date()
ettoLocaleTimeString()
et vous mettre en œuvre comme ceci:Remarquez que j'ai également supprimé la
constructor()
fonction, vous n'en avez pas forcément besoin, mon refactor équivaut à 100% à l'initialisation du site avec laconstructor()
fonction.la source
En raison des changements dans React V16 où componentWillReceiveProps () a été obsolète, c'est la méthodologie que j'utilise pour mettre à jour un composant. Notez que l'exemple ci-dessous est dans Typescript et utilise la méthode statique getDerivedStateFromProps pour obtenir l'état initial et l'état mis à jour chaque fois que les Props sont mis à jour.
la source