Maison >interface Web >js tutoriel >Pourquoi l'utilisation de « setInterval » avec les hooks d'état React provoque-t-elle un comportement inattendu ?

Pourquoi l'utilisation de « setInterval » avec les hooks d'état React provoque-t-elle un comportement inattendu ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-08 13:43:12851parcourir

Why Does Using `setInterval` with React State Hooks Cause Unexpected Behavior?

Utilisation des hooks d'état React avec setInterval : comprendre le problème de mise à jour de l'état

Dans React, l'utilisation du hook d'état dans setInterval peut entraîner des problèmes avec mises à jour de l'état. Cela se produit lorsque la fonction de rappel transmise à setInterval conserve l'accès à la valeur de l'état initial, empêchant ainsi les mises à jour ultérieures d'être reflétées.

Le problème

Considérez le composant Clock suivant :

function Clock() {
  const [time, setTime] = React.useState(0);
  React.useEffect(() => {
    const timer = window.setInterval(() => {
      setTime(time + 1);
    }, 1000);
    return () => {
      window.clearInterval(timer);
    };
  }, []);

  return <div>Seconds: {time}</div>;
}

Le problème réside dans la fonction de rappel setTime. Il fait référence à la variable temporelle au moment du premier rendu, et non à la valeur mise à jour des rendus suivants. De ce fait, la mise à jour de l'état est limitée à la valeur initiale.

La solution

Pour remédier à ce problème, utilisez le formulaire de rappel du state hook, qui fournit accès à la valeur d'état actuelle :

function Clock() {
  const [time, setTime] = React.useState(0);
  React.useEffect(() => {
    const timer = window.setInterval(() => {
      setTime((prevTime) => prevTime + 1); // Get the latest state value
    }, 1000);
    return () => {
      window.clearInterval(timer);
    };
  }, []);

  return <div>Seconds: {time}</div>;
}

Maintenant, la fonction de rappel utilise correctement la dernière valeur d'état, garantissant que l'heure est mise à jour comme attendu.

Approches alternatives

Dan Abramov explore d'autres façons de gérer setInterval avec des hooks dans son article de blog, proposant des approches alternatives qui peuvent convenir à des scénarios spécifiques.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn