React Hooks nous donne l'option useState, et je vois toujours des comparaisons Hooks vs Class-State. Mais qu'en est-il des crochets et de certaines variables régulières?
Par exemple,
function Foo() {
let a = 0;
a = 1;
return <div>{a}</div>;
}
Je n'ai pas utilisé de crochets, et cela me donnera les mêmes résultats que:
function Foo() {
const [a, setA] = useState(0);
if (a != 1) setA(1); // to avoid infinite-loop
return <div>{a}</div>;
}
Alors quelle est la différence? Utiliser des crochets encore plus complexes pour ce cas ... Alors pourquoi commencer à l'utiliser?
javascript
node.js
reactjs
react-hooks
Moshe Nagar
la source
la source
let a = 1; return <div>{a}</div>
et vous obtiendrez le même résultat.Réponses:
La raison en est que si vous
useState
restituez la vue. Les variables seules ne modifient que les bits en mémoire et l'état de votre application peut se désynchroniser avec la vue.Comparez ces exemples:
Dans les deux cas, les
a
modifications au clic, mais uniquement lorsque vous utilisezuseState
correctement la vue, affichenta
la valeur actuelle de.la source
a
sera récupérée après la fin de son exécution, tandis que dans le premier, car elle tire parti deuseState
la valeur dea
useRef
s'il ne voulait pas restituer la vue. La question reste de savoir s'il doit utiliser des variables locales ou des références React. Par exemple, si vous avez un délai d'attente que vous devez effacer, ou une demande http en cours utilisant axios, stockez-vous le délai d'attente ou la source axios dans une variable ou dans une référence React?useRef
(si vous ne voulez pas de rendu) ouuseState
(si vous voulez de nouveau). Dans le cas des minuteries, car ce sont des effets secondaires, elles doivent être démarrées enuseEffect
crochet. Si vous le souhaiteztimerId
uniquement à des fins de nettoyage, vous pouvez le conserver dans la variable locale du gestionnaire . Si vous voulez pouvoir effacer la minuterie d'un autre endroit du composant, vous devez utiliseruseRef
. Le stockagetimerId
dans la variable locale d' un composant serait une erreur car les variables locales sont "réinitialisées" sur chaque rendu.La mise à jour de l'état entraînera un nouveau rendu du composant, mais les valeurs locales ne le sont pas.
Dans votre cas, vous avez rendu cette valeur dans votre composant. Cela signifie que lorsque la valeur est modifiée, le composant doit être restitué pour afficher la valeur mise à jour.
Il sera donc préférable d'utiliser
useState
une valeur locale normale.la source
Votre premier exemple ne fonctionne que parce que les données ne changent pratiquement jamais. Le point d'entrée de l'utilisation
setState
est de restituer l'intégralité de votre composant lorsque l'état se bloque. Donc, si votre exemple nécessitait une sorte de changement d'état ou de gestion, vous réaliserez rapidement que les valeurs de changement seront nécessaires et pour mettre à jour la vue avec la valeur variable, vous aurez besoin de l'état et du rendu.la source
est équivalent à
Quels
useState
retours sont deux choses:si vous appelez,
setA(1)
vous appelezthis.setState({ a: 1 })
et déclenchez un nouveau rendu.la source
Les variables locales seront réinitialisées à chaque rendu lors d'une mutation tandis que l'état sera mis à jour:
la source