setState()
met en file d'attente les changements d'état du composant et indique à React que ce composant et ses enfants doivent être rendus à nouveau avec l'état mis à jour.
La méthode setState est asynchrone, et de fait, elle ne renvoie pas de promesse. Donc, dans les cas où nous voulons mettre à jour ou appeler une fonction, la fonction peut être appelée callback dans la fonction setState comme deuxième argument. Par exemple, dans votre cas ci-dessus, vous avez appelé une fonction en tant que callback setState.
setState(
{ name: "Michael" },
() => console.log(this.state)
);
Le code ci-dessus fonctionne bien pour le composant de classe, mais dans le cas du composant fonctionnel, nous ne pouvons pas utiliser la méthode setState, et nous pouvons utiliser le hook use effect pour obtenir le même résultat.
La méthode évidente qui vient à l'esprit et que vous pouvez utiliser avec useEffect est la suivante :
const [state, setState] = useState({ name: "Michael" })
useEffect(() => {
console.log(state) // do something after state has updated
}, [state])
Mais cela se produirait également lors du premier rendu, nous pouvons donc modifier le code comme suit : nous vérifions l'événement du premier rendu et évitons le rendu de l'état. Par conséquent, l'implémentation peut être faite de la manière suivante :
Nous pouvons utiliser le crochet utilisateur ici pour identifier le premier rendu.
Le crochet useRef nous permet de créer des variables mutables dans les composants fonctionnels. Il est utile pour accéder aux nœuds DOM/éléments React et pour stocker des variables mutables sans déclencher un re-rendu.
const [state, setState] = useState({ name: "Michael" });
const firstTimeRender = useRef(true);
useEffect(() => {
if (!firstTimeRender.current) {
console.log(state);
}
}, [state])
useEffect(() => {
firstTimeRender.current = false
}, [])
2 votes
Dans la classe component, j'ai utilisé async et await pour obtenir le même résultat que ce que vous avez fait pour ajouter un callback dans setState. Malheureusement, cela ne fonctionne pas dans le hook. Même si j'ai ajouté async et await, react n'attend pas la mise à jour de l'état. Peut-être que useEffect est le seul moyen de le faire.
2 votes
@Zhao, vous n'avez pas encore marqué la bonne réponse. Pouvez-vous gentiment nous accorder quelques secondes