From 24677ad0c7a3a1e7368336cb6d0955cc2563af14 Mon Sep 17 00:00:00 2001
From: Laure Retru-Chavastel
Date: Fri, 9 Jun 2023 00:04:47 +0200
Subject: [PATCH 1/6] =?UTF-8?q?=F0=9F=8C=90=20First=20batch=20of=20transla?=
=?UTF-8?q?tion?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../learn/updating-objects-in-state.md | 261 +++++++++---------
1 file changed, 131 insertions(+), 130 deletions(-)
diff --git a/src/content/learn/updating-objects-in-state.md b/src/content/learn/updating-objects-in-state.md
index 9289f2454..5cd1efe64 100644
--- a/src/content/learn/updating-objects-in-state.md
+++ b/src/content/learn/updating-objects-in-state.md
@@ -1,57 +1,57 @@
---
-title: Updating Objects in State
+title: Mettre à jour des objets dans l’état
---
-State can hold any kind of JavaScript value, including objects. But you shouldn't change objects that you hold in the React state directly. Instead, when you want to update an object, you need to create a new one (or make a copy of an existing one), and then set the state to use that copy.
+L’état peut contenir n’importe quel type de valeur JavaScript, y compris des objets. Cependant, vous ne devez pas modifier directement les objets que vous détenez dans l’état de React. Au lieu de ça, lorsque vous souhaitez mettre à jour un objet, vous devez en créer un nouveau (ou faire une copie d’un objet existant), puis définir l’état pour utiliser cette copie.
-- How to correctly update an object in React state
-- How to update a nested object without mutating it
-- What immutability is, and how not to break it
-- How to make object copying less repetitive with Immer
+- Comment mettre à jour correctement un objet dans l’état de React
+- Comment mettre à jour un objet imbriqué sans le muter
+- Qu’est-ce que l’immutabilité, et comment la préserver
+- Comment rendre la copie d’objet moins répétitive avec Immer
-## What's a mutation? {/*whats-a-mutation*/}
+## Qu’est-ce qu’une mutation ? {/*whats-a-mutation*/}
-You can store any kind of JavaScript value in state.
+Vous pouvez stocker n’importe quel type de valeur JavaScript dans l’état.
```js
const [x, setX] = useState(0);
```
-So far you've been working with numbers, strings, and booleans. These kinds of JavaScript values are "immutable", meaning unchangeable or "read-only". You can trigger a re-render to _replace_ a value:
+Jusqu’à présent, vous avez travaillé avec des nombres, des chaînes de caractères et des booléens. Ces types de valeurs JavaScript sont « immuables », c’est-à-dire qu’ils ne peuvent pas être modifiés ou sont en « lecture seule ». Vous pouvez déclencher un nouveau rendu pour *remplacer* une valeur :
```js
setX(5);
```
-The `x` state changed from `0` to `5`, but the _number `0` itself_ did not change. It's not possible to make any changes to the built-in primitive values like numbers, strings, and booleans in JavaScript.
+L’état de `x` est passé de `0` à `5`, mais le *nombre `0` lui-même* n’a pas changé. Il n’est pas possible d’apporter des modifications aux valeurs primitives intégrées comme les nombres, les chaînes de caractères et les booléens en JavaScript.
-Now consider an object in state:
+À présent, considérons un objet dans l’état :
```js
const [position, setPosition] = useState({ x: 0, y: 0 });
```
-Technically, it is possible to change the contents of _the object itself_. **This is called a mutation:**
+Techniquement, il est possible de modifier le contenu de *l’objet lui-même*. **C’est ce qu’on appelle une mutation :**
```js
position.x = 5;
```
-However, although objects in React state are technically mutable, you should treat them **as if** they were immutable--like numbers, booleans, and strings. Instead of mutating them, you should always replace them.
+Cependant, bien que les objets dans l’état de React soient techniquement modifiables, vous devez les traiter *comme s’ils étaient immuables* - comme les nombres, les booléens et les chaînes de caractères. Au lieu de les muter, vous devez toujours les remplacer.
-## Treat state as read-only {/*treat-state-as-read-only*/}
+## Traiter l’état comme en lecture seule {/*treat-state-as-read-only*/}
-In other words, you should **treat any JavaScript object that you put into state as read-only.**
+En d’autres termes, vous devez *considérer tout objet JavaScript que vous placez dans l’état comme étant en lecture seule*.
-This example holds an object in state to represent the current pointer position. The red dot is supposed to move when you touch or move the cursor over the preview area. But the dot stays in the initial position:
+Cet exemple utilise un objet dans l’état pour représenter la position actuelle du pointeur. Le point rouge est censé se déplacer lorsque vous touchez ou déplacez le curseur sur la zone de prévisualisation. Mais le point reste dans la position initiale :
@@ -94,7 +94,7 @@ body { margin: 0; padding: 0; height: 250px; }
-The problem is with this bit of code.
+Le problème se situe dans cette partie du code.
```js
onPointerMove={e => {
@@ -103,9 +103,9 @@ onPointerMove={e => {
}}
```
-This code modifies the object assigned to `position` from [the previous render.](/learn/state-as-a-snapshot#rendering-takes-a-snapshot-in-time) But without using the state setting function, React has no idea that object has changed. So React does not do anything in response. It's like trying to change the order after you've already eaten the meal. While mutating state can work in some cases, we don't recommend it. You should treat the state value you have access to in a render as read-only.
+Ce code modifie l’objet assigné à `position` depuis [le rendu précédent.](/learn/state-as-a-snapshot#rendering-takes-a-snapshot-in-time) Mais sans utiliser la fonction de définition de l’état, React ne se rend pas compte que l’objet a changé. Par conséquent, React ne réagit pas. Ce serait comme essayer de changer la commande après avoir déjà mangé le repas. Bien que la mutation de l’état puisse fonctionner dans certains cas, il est recommandé de ne pas le faire. Vous devez considérer la valeur de l’état à laquelle vous avez accès lors d’un rendu comme étant en lecture seule.
-To actually [trigger a re-render](/learn/state-as-a-snapshot#setting-state-triggers-renders) in this case, **create a *new* object and pass it to the state setting function:**
+Pour effectivement [déclencher un nouveau rendu](/learn/state-as-a-snapshot#setting-state-triggers-renders) dans cet exemple, **créez un nouvel objet et passez-le à la fonction de définition de l’état :**
```js
onPointerMove={e => {
@@ -116,12 +116,12 @@ onPointerMove={e => {
}}
```
-With `setPosition`, you're telling React:
+Avec `setPosition`, vous indiquez à React :
-* Replace `position` with this new object
-* And render this component again
+* Remplace `position` par ce nouvel objet
+* Et rends ce composant à nouveau
-Notice how the red dot now follows your pointer when you touch or hover over the preview area:
+Remarquez comment le point rouge suit maintenant votre curseur lorsque vous le touchez ou le survolez dans la zone de prévisualisation :
@@ -168,16 +168,16 @@ body { margin: 0; padding: 0; height: 250px; }
-#### Local mutation is fine {/*local-mutation-is-fine*/}
+#### La mutation locale est acceptable {/*local-mutation-is-fine*/}
-Code like this is a problem because it modifies an *existing* object in state:
+Le code suivant pose problème car il modifie un objet *existants* dans l’état :
```js
position.x = e.clientX;
position.y = e.clientY;
```
-But code like this is **absolutely fine** because you're mutating a fresh object you have *just created*:
+Mais le code suivant est **tout à fait acceptable** car vous effectuez une mutation sur un nouvel objet que *vous venez de créer* :
```js
const nextPosition = {};
@@ -186,7 +186,7 @@ nextPosition.y = e.clientY;
setPosition(nextPosition);
```
-In fact, it is completely equivalent to writing this:
+En fait, ça revient à écrire ceci :
```js
setPosition({
@@ -195,15 +195,15 @@ setPosition({
});
```
-Mutation is only a problem when you change *existing* objects that are already in state. Mutating an object you've just created is okay because *no other code references it yet.* Changing it isn't going to accidentally impact something that depends on it. This is called a "local mutation". You can even do local mutation [while rendering.](/learn/keeping-components-pure#local-mutation-your-components-little-secret) Very convenient and completely okay!
+La mutation pose problème uniquement lorsque vous modifiez des objets *existants* qui se trouvent déjà dans l’état. Muter un objet que vous venez de créer est acceptable car *aucun autre code ne le référence encore*. Le modifier ne risque pas d’affecter accidentellement quelque chose qui en dépend. C’est ce qu’on appelle une « mutation locale ». Vous pouvez même effectuer une mutation locale [pendant le rendu.](/learn/keeping-components-pure#local-mutation-your-components-little-secret) C'est très pratique et tout à fait acceptable !
-
+
-## Copying objects with the spread syntax {/*copying-objects-with-the-spread-syntax*/}
+## Copier des objets avec la syntaxe de décomposition {/*copying-objects-with-the-spread-syntax*/}
-In the previous example, the `position` object is always created fresh from the current cursor position. But often, you will want to include *existing* data as a part of the new object you're creating. For example, you may want to update *only one* field in a form, but keep the previous values for all other fields.
+Dans l’exemple précédent, l’objet `position` est toujours créé à partir de la position actuelle du curseur. Cependant, vous voudrez souvent inclure des données *existantes* en tant que partie du nouvel objet que vous créez. Par exemple, vous souhaiterez peut-être mettre à jour *uniquement un champ* dans un formulaire, tout en conservant les valeurs précédentes pour tous les autres champs.
-These input fields don't work because the `onChange` handlers mutate the state:
+Ces champs de saisie ne fonctionnent pas car les gestionnaires `onChange` modifient l’état :
@@ -232,21 +232,21 @@ export default function Form() {
return (
<>
- Email :
+ E-mail :
Date: Thu, 6 Jul 2023 10:21:25 +0200
Subject: [PATCH 6/6] copy(updating-objects): final review pass
---
.../learn/updating-objects-in-state.md | 170 +++++++++---------
1 file changed, 84 insertions(+), 86 deletions(-)
diff --git a/src/content/learn/updating-objects-in-state.md b/src/content/learn/updating-objects-in-state.md
index 97fc6210a..491754373 100644
--- a/src/content/learn/updating-objects-in-state.md
+++ b/src/content/learn/updating-objects-in-state.md
@@ -17,7 +17,7 @@ Un état peut contenir n'importe quel type de valeur JavaScript, y compris des o
-## Qu’est-ce qu’une mutation ? {/*whats-a-mutation*/}
+## Qu’est-ce qu’une mutation ? {/*whats-a-mutation*/}
Vous pouvez stocker n’importe quel type de valeur JavaScript dans l’état.
@@ -25,7 +25,7 @@ Vous pouvez stocker n’importe quel type de valeur JavaScript dans l’état.
const [x, setX] = useState(0);
```
-Jusqu’à présent, vous avez travaillé avec des nombres, des chaînes de caractères et des booléens. Ces types de valeurs JavaScript sont « immuables », c’est-à-dire qu’ils ne peuvent pas être modifiés ou sont en « lecture seule ». Vous pouvez déclencher un nouveau rendu pour *remplacer* une valeur :
+Jusqu’à présent, vous avez travaillé avec des nombres, des chaînes de caractères et des booléens. Ces types de valeurs JavaScript sont « immuables », c’est-à-dire qu’ils ne peuvent pas être modifiés ou sont en « lecture seule ». Vous pouvez déclencher un nouveau rendu pour *remplacer* une valeur :
```js
setX(5);
@@ -33,13 +33,13 @@ setX(5);
L’état `x` est passé de `0` à `5`, mais le *nombre `0` lui-même* n’a pas changé. Il est impossible en JavaScript de modifier les valeurs primitives comme les nombres, les chaînes de caractères et les booléens.
-À présent, considérons un objet dans l’état :
+À présent, considérons un objet dans l’état :
```js
const [position, setPosition] = useState({ x: 0, y: 0 });
```
-Techniquement, il est possible de modifier le contenu de *l’objet lui-même*. **C’est ce qu’on appelle une mutation :**
+Techniquement, il est possible de modifier le contenu de *l’objet lui-même*. **C’est ce qu’on appelle une mutation :**
```js
position.x = 5;
@@ -51,7 +51,7 @@ Cependant, bien que des objets dans un état React soient techniquement modifiab
En d’autres termes, vous devez **considérer tout objet JavaScript que vous placez dans l’état comme étant en lecture seule**.
-Cet exemple utilise un objet dans l’état pour représenter la position actuelle du pointeur. Le point rouge est censé se déplacer lorsque vous touchez ou déplacez le curseur sur la zone de prévisualisation. Mais le point reste dans la position initiale :
+Cet exemple utilise un objet dans l’état pour représenter la position actuelle du pointeur. Le point rouge est censé se déplacer lorsque vous touchez ou déplacez le curseur sur la zone de prévisualisation. Mais le point reste dans la position initiale :
@@ -105,7 +105,7 @@ onPointerMove={e => {
Ce code modifie l’objet affecté à `position` lors du [rendu précédent](/learn/state-as-a-snapshot#rendering-takes-a-snapshot-in-time). Mais faute d'utiliser la fonction de mise à jour de l’état, React ne se rend pas compte que l’objet a changé. Par conséquent, React ne réagit pas. Ce serait comme essayer de changer une commande après avoir déjà mangé le repas. Bien que la mutation de l’état puisse fonctionner dans certains cas, nous la déconseillons. Vous devriez considérer la valeur de l’état que vous lisez lors d’un rendu comme étant en lecture seule.
-Pour effectivement [déclencher un nouveau rendu](/learn/state-as-a-snapshot#setting-state-triggers-renders) dans cet exemple, **créez un nouvel objet et passez-le à la fonction de mise à jour de l’état :**
+Pour effectivement [déclencher un nouveau rendu](/learn/state-as-a-snapshot#setting-state-triggers-renders) dans cet exemple, **créez un nouvel objet et passez-le à la fonction de mise à jour de l’état :**
```js
onPointerMove={e => {
@@ -116,12 +116,12 @@ onPointerMove={e => {
}}
```
-Avec `setPosition`, vous indiquez à React :
+Avec `setPosition`, vous indiquez à React :
-* Remplace `position` par ce nouvel objet
-* Et refais le rendu ce composant
+- Remplace `position` par ce nouvel objet
+- Et refais le rendu ce composant
-Voyez comme le point rouge suit désormais votre pointeur lorsque vous le touchez ou le survolez dans la zone de prévisualisation :
+Voyez comme le point rouge suit désormais votre pointeur lorsque vous le touchez ou le survolez dans la zone de prévisualisation :
@@ -170,14 +170,14 @@ body { margin: 0; padding: 0; height: 250px; }
#### La mutation locale est acceptable {/*local-mutation-is-fine*/}
-Le code suivant pose problème car il modifie un objet *existant* dans l’état :
+Le code suivant pose problème car il modifie un objet *existant* dans l’état :
```js
position.x = e.clientX;
position.y = e.clientY;
```
-Mais le code suivant est **tout à fait acceptable** car vous modifiez un nouvel objet que *vous venez de créer* :
+Mais le code suivant est **tout à fait acceptable** car vous modifiez en réalité un nouvel objet que *vous venez de créer* :
```js
const nextPosition = {};
@@ -186,7 +186,7 @@ nextPosition.y = e.clientY;
setPosition(nextPosition);
```
-En fait, ça revient à écrire ceci :
+En fait, ça revient à écrire ceci :
```js
setPosition({
@@ -203,7 +203,7 @@ La mutation pose problème uniquement lorsque vous modifiez des objets *existant
Dans l’exemple précédent, l’objet `position` est toujours recréé à partir de la position actuelle du curseur. Ceci dit, vous voudrez souvent inclure des données *existantes* au sein du nouvel objet que vous créez. Par exemple, vous souhaiterez peut-être mettre à jour *un seul champ* dans un formulaire, tout en conservant les valeurs précédentes des autres champs.
-Ces champs de saisie ne fonctionnent pas car les gestionnaires `onChange` modifient l’état :
+Ces champs de saisie ne fonctionnent pas car les gestionnaires `onChange` modifient l’état :
@@ -232,21 +232,21 @@ export default function Form() {
return (
<>
- Prénom :
+ Prénom :
- Nom de famille :
+ Nom de famille :
- E-mail :
+ E-mail :
-Par exemple, cette ligne modifie l’état à partir d’un rendu précédent :
+Par exemple, cette ligne modifie l’état à partir d’un rendu précédent :
```js
person.firstName = e.target.value;
```
-La façon fiable d’obtenir le comportement que vous recherchez consiste à créer un nouvel objet et de le passer à `setPerson`. Mais ici, vous souhaitez également **copier les données existantes** car un seul des champs a changé :
+La manière fiable d’obtenir le comportement que vous recherchez consiste à créer un nouvel objet et à le passer à `setPerson`. Mais ici, vous souhaitez également **copier les données existantes**, puisqu'un seul des champs a changé :
```js
setPerson({
@@ -285,7 +285,7 @@ setPerson({
});
```
-Vous pouvez utiliser la syntaxe de [*spread* sur objets](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Operators/Spread_syntax#utiliser_la_d%C3%A9composition_avec_les_litt%C3%A9raux_objet) `...` afin de ne pas avoir à copier chaque propriété individuellement.
+Vous pouvez utiliser la syntaxe de [*spread* sur objets](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Operators/Spread_syntax#utiliser_la_d%C3%A9composition_avec_les_litt%C3%A9raux_objet) `...` afin de ne pas devoir manuellement copier chaque propriété individuellement.
```js
setPerson({
@@ -294,9 +294,9 @@ setPerson({
});
```
-Maintenant, le formulaire fonctionne !
+Maintenant, le formulaire fonctionne !
-Remarquez que vous n’avez pas déclaré une variable d’état distincte pour chaque champ de saisie. Pour les grands formulaires, regrouper toutes les données dans un objet est très pratique, à condition de les mettre à jour correctement !
+Remarquez que vous n’avez pas déclaré une variable d’état distincte pour chaque champ de saisie. Pour les grands formulaires, regrouper toutes les données dans un objet est très pratique, à condition de les mettre à jour correctement !
@@ -334,21 +334,21 @@ export default function Form() {
return (
<>
- Prénom :
+ Prénom :
- Nom de famille :
+ Nom de famille :
- E-mail :
+ E-mail :
@@ -401,7 +401,7 @@ export default function Form() {
return (
<>
- Prénom :
+ Prénom :
- Nom de famille :
+ Nom de famille :
- E-mail :
+ E-mail :
@@ -543,28 +543,28 @@ export default function Form() {
return (
<>
- Nom :
+ Nom :
- Titre :
+ Titre :
- Ville :
+ Ville :
- Image :
+ Image :
(situé à {person.artwork.city})
-
>
@@ -598,7 +598,7 @@ img { width: 200px; height: 200px; }
#### Les objets ne sont pas réellement imbriqués {/*objects-are-not-really-nested*/}
-Un objet comme celui-ci semble « imbriqué » dans le code :
+Un objet comme celui-ci semble « imbriqué » dans le code :
```js
let obj = {
@@ -611,7 +611,7 @@ let obj = {
};
```
-Cependant, l’« imbrication » est une façon inexacte d’envisager le comportement des objets. Lorsque le code s’exécute, il n’existe pas d’objet « imbriqué ». Il s’agit en fait de deux objets distincts :
+Cependant, l’« imbrication » est une façon inexacte d’envisager le comportement des objets. Lorsque le code s’exécute, il n’existe pas d’objet « imbriqué ». Il s’agit en fait de deux objets distincts :
```js
let obj1 = {
@@ -626,7 +626,7 @@ let obj2 = {
};
```
-L’objet `obj1` n’est pas « à l’intérieur » de `obj2`. Par exemple, `obj3` pourrait également « pointer » vers `obj1` :
+L’objet `obj1` n’est en réalité pas « à l’intérieur » de `obj2`. Par exemple, `obj3` pourrait également « pointer » vers `obj1` :
```js
let obj1 = {
@@ -646,13 +646,13 @@ let obj3 = {
};
```
-Si vous modifiiez `obj3.artwork.city`, ça affecterait à la fois `obj2.artwork.city` et `obj1.city`. C’est parce qu'`obj3.artwork`, `obj2.artwork` et `obj1` sont le même objet. C’est difficile à percevoir quand on considère les objets comme « imbriqués ». Il s’agit plutôt d’objets distincts qui « pointent » les uns vers les autres à l’aide de propriétés.
+Si vous modifiiez `obj3.artwork.city`, ça affecterait à la fois `obj2.artwork.city` et `obj1.city`. C’est parce qu'`obj3.artwork`, `obj2.artwork` et `obj1` sont le même objet. C’est difficile à percevoir quand on considère les objets comme « imbriqués ». Il s’agit plutôt d’objets distincts qui « pointent » les uns vers les autres à l’aide de propriétés.
-
+
### Écrire une logique de mise à jour concise avec Immer {/*write-concise-update-logic-with-immer*/}
-Si votre état est profondément imbriqué, vous envisagerez peut-être de [l’aplanir](/learn/choosing-the-state-structure#avoid-deeply-nested-state). Mais si vous ne voulez pas modifier la structure de votre état, vous préférerez peut-être un raccourci aux *spreads* imbriqués. [Immer](https://github.com/immerjs/use-immer) est une bibliothèque populaire qui vous permet d’écrire votre code en utilisant une syntaxe pratique mais modifiante, et se charge de produire les copies pour vous. Avec Immer, le code que vous écrivez semble « enfreindre les règles » et modifier un objet :
+Si votre état est profondément imbriqué, vous envisagerez peut-être de [l’aplanir](/learn/choosing-the-state-structure#avoid-deeply-nested-state). Mais si vous ne voulez pas modifier la structure de votre état, vous préférerez peut-être un raccourci aux *spreads* imbriqués. [Immer](https://github.com/immerjs/use-immer) est une bibliothèque populaire qui vous permet d’écrire votre code en utilisant une syntaxe pratique mais modifiante, et se charge de produire les copies pour vous. Avec Immer, le code que vous écrivez semble « enfreindre les règles » et modifier un objet :
```js
updatePerson(draft => {
@@ -660,22 +660,22 @@ updatePerson(draft => {
});
```
-Mais contrairement à une mutation classique, ça n’écrase pas l’état précédent !
+Mais contrairement à une mutation classique, ça n’écrase pas l’état précédent !
-#### Comment fonctionne Immer ? {/*how-does-immer-work*/}
+#### Comment fonctionne Immer ? {/*how-does-immer-work*/}
-Le `draft` fourni par Immer est un type spécial d’objet, appelé [Proxy](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Proxy), qui « enregistre » ce que vous faites avec. C’est pourquoi vous pouvez le modifier autant que vous le souhaitez ! Sous le capot, Immer détermine quelles parties du `draft` ont été modifiées et produit un tout nouvel objet qui contient vos modifications.
+Le `draft` fourni par Immer est un type spécial d’objet JavaScript, appelé [Proxy](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Proxy), qui « enregistre » ce que vous faites avec. C’est pourquoi vous pouvez le modifier autant que vous le souhaitez ! Sous le capot, Immer détermine quelles parties du `draft` ont été modifiées et produit un tout nouvel objet qui contient vos modifications.
-Pour essayer Immer :
+Pour essayer Immer :
1. Exécutez `npm install use-immer` pour ajouter Immer en tant que dépendance
2. Remplacez alors `import { useState } from 'react'` par `import { useImmer } from 'use-immer'`.
-Voici l’exemple ci-dessus converti en Immer :
+Voici l’exemple ci-dessus converti en Immer :
@@ -719,28 +719,28 @@ export default function Form() {
return (
<>
- Nom :
+ Nom :
- Titre :
+ Titre :
- Ville :
+ Ville :
- Image :
+ Image :
(situé à {person.artwork.city})
-
>
@@ -792,39 +792,37 @@ Remarquez à quel point les gestionnaires d’événements sont devenus plus con
-#### Pourquoi déconseiller la mutation d’état dans React ? {/*why-is-mutating-state-not-recommended-in-react*/}
+#### Pourquoi déconseiller la mutation d’état dans React ? {/*why-is-mutating-state-not-recommended-in-react*/}
-Il y a plusieurs raisons :
+Il y a plusieurs raisons :
-* **Débogage :** si vous utilisez `console.log` et que vous ne modifiez pas l’état, vos anciens logs ne seront pas écrasés par les changements d’état plus récents. Vous pouvez donc voir clairement comment l’état a changé entre les rendus.
-* **Optimisations :** les [stratégies d’optimisation](/reference/react/memo) courantes de React reposent sur la possibilité de sauter des étapes si les propriétés ou l’état précédents sont identiques aux suivants. Si vous ne modifiez jamais l’état, vérifier s’il y a eu des changements peut être très rapide. Si `prevObj === obj`, vous pouvez être certain·e qu’aucun changement n’a pu se produire à l’intérieur de celui-ci.
-* **Nouvelles fonctionnalités :** les nouvelles fonctionnalités de React que nous développons reposent sur le fait que l’état est [traité comme un instantané](/learn/state-as-a-snapshot). Si vous modifiez des versions précédentes de l’état, ça peut vous empêcher d’utiliser les nouvelles fonctionnalités.
-* **Changements de besoin :** certaines fonctionnalités d’application, comme l’implémentation d’actions pour annuler/rétablir, l’affichage d’un historique des modifications ou la possibilité de réinitialiser un formulaire à des valeurs antérieures, sont plus faciles à réaliser lorsque rien n’est modifié. Ceci est dû au fait que vous pouvez conserver en mémoire des copies passées de l’état et les réutiliser lorsque c’est pertinent. Si vous adoptez une approche modifiante dès le départ, il peut être difficile d’ajouter ultérieurement ce type de fonctionnalités.
-* **Implémentation simplifiée :** puisque React ne repose pas sur la mutation, il n’a pas besoin de faire quoi que ce soit de spécial avec vos objets. Il n’a pas besoin de trafiquer leurs propriétés, de toujours les envelopper dans des proxies ou de réaliser d’autres actions à l’initialisation, comme le font de nombreuses solutions « réactives ». C’est également la raison pour laquelle React vous permet de mettre n’importe quel objet dans l’état, quelle que soit sa taille, sans problèmes de performances ou d’exactitude.
+- **Débogage :** si vous utilisez `console.log` et que vous ne modifiez pas l’état, vos anciens logs ne seront pas écrasés par les changements d’état plus récents. Vous pouvez donc voir clairement comment l’état a changé entre les rendus.
+- **Optimisations :** les [stratégies d’optimisation](/reference/react/memo) courantes de React reposent sur la possibilité de sauter des étapes si les propriétés ou l’état précédents sont identiques aux suivants. Si vous ne modifiez jamais l’état, vérifier s’il y a eu des changements peut être très rapide. Si `prevObj === obj`, vous pouvez être certain·e qu’aucun changement n’a pu se produire à l’intérieur de celui-ci.
+- **Nouvelles fonctionnalités :** les nouvelles fonctionnalités de React que nous développons reposent sur le fait que l’état est [traité comme un instantané](/learn/state-as-a-snapshot). Si vous modifiez des versions précédentes de l’état, ça peut vous empêcher d’utiliser les nouvelles fonctionnalités.
+- **Changements de besoin :** certaines fonctionnalités d’application, comme l’implémentation d’actions pour annuler/rétablir, l’affichage d’un historique des modifications ou la possibilité de réinitialiser un formulaire à des valeurs antérieures, sont plus faciles à réaliser lorsque rien n’est modifié. Ceci est dû au fait que vous pouvez conserver en mémoire des copies passées de l’état et les réutiliser lorsque c’est pertinent. Si vous adoptez une approche modifiante dès le départ, il peut être difficile d’ajouter ultérieurement ce type de fonctionnalités.
+- **Implémentation simplifiée :** puisque React ne repose pas sur la mutation, il n’a pas besoin de faire quoi que ce soit de spécial avec vos objets. Il n’a pas besoin de trafiquer leurs propriétés, de toujours les envelopper dans des proxies ou de réaliser d’autres actions à l’initialisation, comme le font de nombreuses solutions « réactives ». C’est également la raison pour laquelle React vous permet de mettre n’importe quel objet dans l’état, quelle que soit sa taille, sans que ça cause des problèmes de performances ou d’exactitude.
-En pratique, vous pouvez souvent « vous en sortir » en modifiant l’état dans React, mais nous vous conseillons fortement de ne pas le faire afin de pouvoir utiliser les nouvelles fonctionnalités de React développées dans cette optique. Les futurs contributeurs, et peut-être vous-même, vous en seront reconnaissants !
+En pratique, vous pouvez souvent « vous en sortir » en modifiant directement l’état dans React, mais nous vous conseillons fortement de ne pas le faire afin de pouvoir utiliser les nouvelles fonctionnalités de React développées dans cette optique. Les futurs contributeurs, et peut-être vous-même, vous en seront reconnaissants !
-* Traitez tous les états dans React comme étant immuables.
-* Lorsque vous stockez des objets dans l’état, les modifier ne déclenchera pas de rendus et modifiera l’état dans les « instantanés » issus de rendus précédents.
-* Au lieu de modifier un objet, créez une *nouvelle* version de celui-ci et déclenchez un nouveau rendu en définissant l’état sur cette nouvelle version.
-* Vous pouvez utiliser la syntaxe de *spread* d’objet `{...obj, something: 'newValue'}` pour créer des copies d’objets.
-* La syntaxe de *spread* est superficielle : elle ne copie qu’à un niveau de profondeur.
-* Pour mettre à jour un objet imbriqué, vous devez créer des copies à partir de l’endroit où vous effectuez la mise à jour, en remontant jusqu’au plus haut niveau de l’objet.
-* Pour réduire le code requis pour créer des copies d’objet, utilisez Immer.
+- Traitez tous les états dans React comme étant immuables.
+- Lorsque vous stockez des objets dans l’état, les modifier ne déclenchera pas de rendus et modifiera l’état dans les « instantanés » issus de rendus précédents.
+- Au lieu de modifier un objet, créez une *nouvelle* version de celui-ci et déclenchez un nouveau rendu en définissant l’état sur cette nouvelle version.
+- Vous pouvez utiliser la syntaxe de *spread* d’objet `{...obj, something: 'newValue'}` pour créer des copies d’objets existants.
+- La syntaxe de *spread* est superficielle : elle ne copie qu’à un niveau de profondeur.
+- Pour mettre à jour un objet imbriqué, vous devez créer des copies à partir de l’endroit où vous effectuez la mise à jour, en remontant jusqu’au plus haut niveau de l’objet.
+- Pour réduire le code requis pour créer des copies d’objet, utilisez Immer.
-
-
#### Corriger les mises à jour incorrectes de l’état {/*fix-incorrect-state-updates*/}
-Ce formulaire comporte quelques bugs. Cliquez sur le bouton qui augmente le score plusieurs fois. Remarquez qu’il n’augmente pas. Ensuite, modifiez le prénom et remarquez que le score a soudainement « rattrapé » vos modifications. Enfin, modifiez le nom de famille et remarquez que le score a complètement disparu.
+Ce formulaire comporte quelques bugs. Cliquez sur le bouton qui augmente le score plusieurs fois. Remarquez qu’il n’augmente pas. Ensuite, modifiez le prénom et remarquez que le score a soudainement « rattrapé » vos modifications. Enfin, modifiez le nom de famille et remarquez que le score a complètement disparu.
Votre tâche consiste à corriger tous ces bugs. En les corrigeant, expliquez pourquoi chacun d’entre eux se produit.
@@ -867,14 +865,14 @@ export default function Scoreboard() {
- Prénom :
+ Prénom :
- Nom de famille :
+ Nom de famille :
-Voici une version avec les deux bugs corrigés :
+Voici une version avec les deux bugs corrigés :
@@ -939,14 +937,14 @@ export default function Scoreboard() {
- Prénom :
+ Prénom :
- Nom de famille :
+ Nom de famille :
- Déplacez-moi !
+ Déplacez-moi !
>
);
@@ -1187,7 +1185,7 @@ export default function Canvas() {
position={shape.position}
onMove={handleMove}
>
- Déplacez-moi !
+ Déplacez-moi !
>
);
@@ -1338,7 +1336,7 @@ export default function Canvas() {
position={shape.position}
onMove={handleMove}
>
- Déplacez-moi !
+ Déplacez-moi !
>
);
@@ -1505,7 +1503,7 @@ export default function Canvas() {
position={shape.position}
onMove={handleMove}
>
- Déplacez-moi !
+ Déplacez-moi !
>
);