You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
|`useRef(initialValue)` renvoie `{ current: initialValue }`|`useState(initialValue)` renvoie la valeur actuelle d'une variable d'état et une fonction de modification de cette valeur (`[value, setValue]`) |
179
+
|`useRef(initialValue)` renvoie `{ current: initialValue }`.|`useState(initialValue)` renvoie la valeur actuelle d'une variable d'état et une fonction de modification de cette valeur (`[value, setValue]`).|
180
180
| Ne redéclenche pas un rendu quand vous la modifiez. | Déclenche un nouveau rendu quand vous la modifiez. |
181
181
| Modifiable : vous pouvez changer la valeur de `current` hors du rendu. | « Immuable » : vous devez passer par la fonction de mise à jour de l'état pour changer la variable d'état, ce qui est mis en attente pour le prochain rendu. |
182
182
| Vous ne devriez pas lire (ou écrire) la valeur de `current` pendant le rendu. | Vous pouvez lire l'état à tout moment. En revanche, chaque rendu a son propre [instantané](/learn/state-as-a-snapshot) de l'état, qui ne change pas.
@@ -207,7 +207,7 @@ export default function Counter() {
207
207
208
208
Étant donné que la valeur `count` est affichée, il est logique d'utiliser une variable d'état pour la stocker. Quand la valeur du compteur est modifiée via `setCount()`, React fait un nouveau rendu du composant et l'écran est mis à jour pour refléter le nouveau compteur.
209
209
210
-
Si vous utilisiez une ref, React ne déclencherait jamais un nouveau rendu du composant, et vous ne verriez jamais la valeur changer ! Essayez ci-dessous de cliquer le bouton :**ça ne met pas à jour le texte** :
210
+
Si vous utilisiez une ref, React ne déclencherait jamais un nouveau rendu du composant, et vous ne verriez jamais la valeur changer ! Essayez ci-dessous de cliquer le bouton,**ça ne met pas à jour le texte** :
211
211
212
212
<Sandpack>
213
213
@@ -238,7 +238,7 @@ Voilà pourquoi la lecture de `ref.current` pendant le rendu n'est pas une prati
238
238
239
239
#### Comment fonctionne `useRef` en interne ? {/*how-does-use-ref-work-inside*/}
240
240
241
-
Même si `useState` et `useRef` sont fournis par React, en principe `useRef` pourrait être implémenté *par-dessus*`useState`. On pourrait imaginer que dans le code de React, `useRef`est implémenté comme ceci :
241
+
Même si `useState` et `useRef` sont fournis par React, en principe `useRef` pourrait être implémenté *par-dessus*`useState`. On pourrait imaginer que dans le code de React, `useRef`serait peut-être implémenté de la façon suivante :
242
242
243
243
```js
244
244
// Dans React…
@@ -248,21 +248,21 @@ function useRef(initialValue) {
248
248
}
249
249
```
250
250
251
-
Lors du premier rendu, `useRef` renvoie `{ current: initialValue}`. Cet objet est stocké par React, de sorte qu'au prochain rendu il renverra le même objet. Remarquez que la fonction de modification de l'état est inutilisée dans cet exemple. Elle est superflue puisque `useRef` renvoie toujours le même objet !
251
+
Lors du premier rendu, `useRef` renvoie `{ current: initialValue}`. Cet objet est stocké par React, de sorte qu'au prochain rendu il renverra le même objet. Remarquez que la fonction de modification de l'état est inutilisée dans ce code. Elle est superflue puisque `useRef` renvoie toujours le même objet !
252
252
253
-
React fournit directement `useRef` parce qu'il s'agit d'un cas d'usage suffisamment courant. Mais vous pouvez y penser comme à une variable d'état classique mais sans fonction modificatrice. Si vous avez l'habitude de la programmation orientée objet, les refs vous font peut-être penser à des champs d'instance--sauf qu'au lieu d'écrire `this.something` vous écrivez `somethingRef.current`.
253
+
React fournit directement `useRef` parce qu'il s'agit d'un cas d'usage suffisamment courant. Mais vous pouvez le voir comme une variable d'état classique mais sans fonction modificatrice. Si vous avez l'habitude de la programmation orientée objet, les refs vous font peut-être penser à des champs d'instance--sauf qu'au lieu d'écrire `this.something` vous écrivez `somethingRef.current`.
254
254
255
255
</DeepDive>
256
256
257
257
## Quand utiliser des refs {/*when-to-use-refs*/}
258
258
259
-
En général, vous utiliserez une ref lorsque votre composant a besoin de « sortir » de React et communiquer avec des API extérieures (souvent une API du navigateur qui n'impactera pas l'apparence du composant). Voici quelques-unes de ces situations assez rares :
259
+
En général, vous utiliserez une ref lorsque votre composant a besoin de « sortir » de React et communiquer avec des API extérieures (souvent une API du navigateur qui n'impactera pas l'apparence du composant). Voici quelques-unes de ces situations peu fréquentes :
260
260
261
261
- Conserver des [ID de timers](https://developer.mozilla.org/fr/docs/Web/API/setTimeout).
262
262
- Référencer puis manipuler des [éléments du DOM](https://developer.mozilla.org/fr/docs/Web/API/Element), comme nous le verrons en détail [dans la prochaine page](/learn/manipulating-the-dom-with-refs).
263
263
- Référencer d'autres objets qui ne sont pas nécessaires au calcul du JSX.
264
264
265
-
Si votre composant a besoin de stocker une valeur, mais qu'elle n'impacte pas la logique de rendu, optez pour une ref.
265
+
Si votre composant a besoin de stocker une valeur, mais que cette valeur n'impacte pas la logique de rendu, optez pour une ref.
266
266
267
267
## Meilleures pratiques pour les refs {/*best-practices-for-refs*/}
268
268
@@ -278,9 +278,9 @@ ref.current = 5;
278
278
console.log(ref.current); // 5
279
279
```
280
280
281
-
C'est parce que **la ref elle-même n'est qu'un objet JavaScript brut**, et se comporte donc comme telle.
281
+
C'est parce que **la ref elle-même n'est qu'un objet JavaScript brut**, et se comporte donc comme tel.
282
282
283
-
Vous n'avez pas non plus à vous préoccuper [d'éviter les mutations](/learn/updating-objects-in-state) lorsque vous travaillez avec une ref. Tant que l'objet que vous modifiez n'est pas utilisé pour le rendu, React se fiche de ce que vous faites avec la ref et son contenu.
283
+
Vous n'avez pas non plus à vous préoccuper [d'éviter les mutations](/learn/updating-objects-in-state) lorsque vous travaillez avec une ref. Du moment que l'objet que vous modifiez n'est pas utilisé pour le rendu, React se fiche de ce que vous faites avec la ref et son contenu.
284
284
285
285
## Les refs et le DOM {/*refs-and-the-dom*/}
286
286
@@ -462,15 +462,15 @@ export default function Toggle() {
462
462
463
463
#### Corriger le *debouncing* {/*fix-debouncing*/}
464
464
465
-
Dans l'exemple qui suit, tous les gestionnaires de clic des boutons sont ["debounced"](https://redd.one/blog/debounce-vs-throttle). Pour saisir ce que ça signifie, pressez l'un des boutons. Remarquez que le message apparait une seconde plus tard. Si vous pressez le bouton pendant que vous attendez le message, le timer sera réinitialisé. Du coup, si vous cliquez en rafale sur le même bouton, le message n'apparaîtra qu'une seconde *après* que vous aurez arrêté de cliquer. Le *debouncing* permet de retarder une action jusqu'à ce que l'utilisateur « termine ce qu'il est en train de faire ».
465
+
Dans l'exemple qui suit, tous les gestionnaires de clic des boutons sont *["debounced"](https://redd.one/blog/debounce-vs-throttle)*. Pour saisir ce que ça signifie, pressez l'un des boutons. Remarquez que le message apparaît une seconde plus tard. Si vous pressez le bouton pendant que vous attendez le message, le timer sera réinitialisé. Du coup, si vous cliquez en rafale sur le même bouton, le message n'apparaîtra qu'une seconde *après* que vous aurez arrêté de cliquer. Le *debouncing* permet de retarder une action jusqu'à ce que l'utilisateur « termine ce qu'il est en train de faire ».
466
466
467
-
Cet exemple fonctionne, mais pas tout à fait comme prévu. Les boutons ne sont pas indépendants. Pour comprendre le problème, cliquez sur l'un des boutons, puis cliquez immédiatement sur un autre bouton. Vous vous attendriez à ce qu'une fois le délai écoulé, vous obteniez les messages des deux boutons. Mais seul le message du dernier boutton apparaît. Celui du premier bouton est perdu.
467
+
Cet exemple fonctionne, mais pas tout à fait comme prévu. Les boutons ne sont pas indépendants. Pour comprendre le problème, cliquez sur l'un des boutons, puis cliquez immédiatement sur un autre bouton. Vous vous attendriez à ce qu'une fois le délai écoulé, vous obteniez les messages des deux boutons. Mais seul le message du dernier bouton apparaît. Celui du premier bouton est perdu.
468
468
469
469
Pourquoi ces boutons interfèrent-ils l'un avec l'autre ? Trouvez et corrigez le problème.
470
470
471
471
<Hint>
472
472
473
-
La variable contenant l'ID du dernier timer en date est partagée par tous les composants `DebouncedButton`. C'est pour ça que cliquer un bouton réinitialise le timer d'un autre bouton. Comment stocker un ID de timer distinct pour chaque bouton ?
473
+
La variable contenant l'ID du dernier timer en date est partagée par tous les composants `DebouncedButton`. C'est pour ça que cliquer sur un des boutons réinitialise aussi le timer des autres boutons. Comment stocker un ID de timer distinct pour chaque bouton ?
474
474
475
475
</Hint>
476
476
@@ -614,7 +614,7 @@ export default function Chat() {
614
614
615
615
<Solution>
616
616
617
-
L'état fonctionne [comme un instantané](/learn/state-as-a-snapshot), de sorte que vous ne pouvez pas lire le dernier état à jour depuis un traitement asynchrone comme un timer. En revanche, vous pouvez conserver la valeur saisie dans une ref. Une ref est modifiable, donc vous pouvez lire sa propriété `current` à tout moment. Comme le texte saisi est aussi utilisé pour le rendu, dans cet exemple il vous faudra *à la fois une variable d'état (pour le rendu) *et* une ref (pour la lire depuis le timeout). Il vous faudra mettre à jour la valeur de la ref manuellement.
617
+
L'état fonctionne [comme un instantané](/learn/state-as-a-snapshot), de sorte que vous ne pouvez pas lire le dernier état à jour depuis un traitement asynchrone comme un timer. En revanche, vous pouvez conserver la valeur saisie dans une ref. Une ref est modifiable, donc vous pouvez lire sa propriété `current` à tout moment. Comme le texte saisi est aussi utilisé pour le rendu, dans cet exemple il vous faudra *à la fois* une variable d'état (pour le rendu) *et* une ref (pour la lire depuis le timeout). Vous aurez besoin de mettre à jour la valeur de la ref manuellement.
0 commit comments