55 votes

React Hooks - utiliser useState ou simplement des variables

React Hooks nous donne l'option useState, et je vois toujours des comparaisons entre Hooks et Class-State. Mais qu'en est-il des Hooks et des variables ordinaires ?

Par exemple,

function Foo() {
    let a = 0;
    a = 1;
    return <div>{a}</div>;
}

Je n'ai pas utilisé de crochets, et cela me donne 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 ? L'utilisation des crochets est encore plus complexe dans ce cas... Alors pourquoi commencer à les utiliser ?

0 votes

Mais vous comparez deux choses différentes. La deuxième fonction avec les crochets a la possibilité de mettre à jour les données. La première ne fait pas vraiment quelque chose. Vous auriez pu simplement l'initialiser avec let a = 1; return <div>{a}</div> et vous obtiendrez le même résultat.

61voto

marzelin Points 2196

La raison est que si vous useState cela change la vue. Les variables en elles-mêmes ne changent que des bits en mémoire et l'état de votre application peut être désynchronisé avec la vue.

Comparez ces exemples :

function Foo() {
    const [a, setA] = useState(0);
    return <div onClick={() => setA(a + 1)}>{a}</div>;
}

function Foo() {
    let a = 0;
    return <div onClick={() => a + 1}>{a}</div>;
}

Dans les deux cas a change en cas de clic, mais seulement lorsque vous utilisez useState la vue montre correctement a La valeur actuelle de l'entreprise.

2 votes

Merci ! Donc si je n'ai pas besoin de rendre la vue - seulement un moyen d'organiser mes données (props) dans un tableau - je peux utiliser 'let' ? Cela fonctionne pour moi, je veux juste savoir si c'est correct et acceptable.

11 votes

@MosheNagar si vous dérivez vos données à partir de props, il est recommandé d'utiliser des variables locales au lieu de garder les données dans l'état parce que le composant sera rendu à chaque changement de prop de toute façon et la vue sera synchronisée avec les données. Les mettre dans l'état ne ferait que provoquer un rerender inutile - d'abord au changement de prop, puis au changement d'état.

3 votes

Une autre façon de voir cette réponse est de penser que dans le second cas, la variable a sera récupéré après la fin de son exécution, alors que dans le premier cas, puisqu'il tire parti de l'option useState il préservera la valeur de a

11voto

Drew Reese Points 1957

Les variables locales seront réinitialisées à chaque rendu lors de la mutation, tandis que l'état sera mis à jour :

function App() {
  let a = 0; // reset to 0 on render/re-render
  const [b, setB] = useState(0);

  return (
    <div className="App">
      <div>
        {a}
        <button onClick={() => a++}>local variable a++</button>
      </div>
      <div>
        {b}
        <button onClick={() => setB(prevB => prevB + 1)}>
          state variable b++
        </button>
      </div>
    </div>
  );
}

Edit serene-galileo-ml3f0

0 votes

Local variables will get reset every render upon mutation whereas state will update . C'est correct avec le composant fonctionnel. Et pour le composant de classe ?

1 votes

@NguyenVanPhong Si vous faites référence aux propriétés de classe, non, elles ne font pas partie du cycle de vie du composant. Si vous faites référence à des variables déclarées dans la section render la méthode du cycle de vie ( par exemple ), ils seront redéclarés à chaque rendu, comme dans les composants fonctionnels.

1 votes

C'est logique. +1

1voto

Antonio Points 413

La mise à jour de l'état entraîne un nouveau rendu du composant, mais pas des valeurs locales.

Dans votre cas, vous avez rendu cette valeur dans votre composant. Cela signifie que, lorsque la valeur est modifiée, le composant doit être rendu à nouveau pour afficher la valeur mise à jour.

Il sera donc préférable d'utiliser useState que la valeur locale normale.

function Foo() {
    let a = 0;
    a = 1; // there will be no re-render.
    return <div>{a}</div>;
}

function Foo() {
    const [a, setA] = useState(0);
    if (a != 1) setA(1); // re-render required
    return <div>{a}</div>;
}

1voto

schogges Points 240
function Foo() {
    const [a, setA] = useState(0);
    if (a != 1) setA(1); // to avoid infinite-loop
    return <div>{a}</div>;
}

est équivalent à

class Foo extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            a: 0
        };
    }
    // ...
}

Quoi useState Les retours sont deux choses :

  1. nouvelle variable d'état
  2. setter pour cette variable

si vous appelez setA(1) vous appelleriez this.setState({ a: 1 }) et déclencher un nouveau rendu.

0voto

10100111001 Points 1437

Votre premier exemple ne fonctionne que parce que les données ne changent pratiquement jamais. Le point d'entrée de l'utilisation de setState est de rendre tout le composant quand l'état change. Ainsi, si votre exemple nécessite une sorte de changement d'état ou de gestion, vous réaliserez rapidement que des valeurs de changement seront nécessaires et que pour mettre à jour la vue avec la valeur de la variable, vous aurez besoin de l'état et du rendu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X