diff --git a/src/content/reference/react/useState.md b/src/content/reference/react/useState.md index d23fa489b..a8605a806 100644 --- a/src/content/reference/react/useState.md +++ b/src/content/reference/react/useState.md @@ -4,7 +4,7 @@ title: useState -`useState` is a React Hook that lets you add a [state variable](/learn/state-a-components-memory) to your component. +`useState` est un Hook React qui ajoute une [variable d'état](/learn/state-a-components-memory) dans votre composant. ```js const [state, setState] = useState(initialState); @@ -16,104 +16,104 @@ const [state, setState] = useState(initialState); --- -## Reference {/*reference*/} +## Référence {/*reference*/} ### `useState(initialState)` {/*usestate*/} -Call `useState` at the top level of your component to declare a [state variable.](/learn/state-a-components-memory) +Appelez `useState` à la racine de votre composant pour déclarer une [variable d'état](/learn/state-a-components-memory). ```js import { useState } from 'react'; function MyComponent() { const [age, setAge] = useState(28); - const [name, setName] = useState('Taylor'); + const [name, setName] = useState('Clara'); const [todos, setTodos] = useState(() => createTodos()); // ... ``` -The convention is to name state variables like `[something, setSomething]` using [array destructuring.](https://javascript.info/destructuring-assignment) +La convention est de nommer les variables d'états de cette manière : `[something, setSomething]`, en utilisant la [déstructuration positionnelle](https://fr.javascript.info/destructuring-assignment). -[See more examples below.](#usage) +[Voir d’autres exemples ci-dessous](#usage). -#### Parameters {/*parameters*/} +#### Paramètres {/*parameters*/} -* `initialState`: The value you want the state to be initially. It can be a value of any type, but there is a special behavior for functions. This argument is ignored after the initial render. - * If you pass a function as `initialState`, it will be treated as an _initializer function_. It should be pure, should take no arguments, and should return a value of any type. React will call your initializer function when initializing the component, and store its return value as the initial state. [See an example below.](#avoiding-recreating-the-initial-state) +* `initialState`: La valeur initiale de votre état. Ça peut être une valeur de n'importe quel type, mais il existe un comportement spécial pour les fonctions. Cet argument est ignoré après le rendu initial. + * Si vous passez une fonction comme `initialState`, elle sera traitée comme une _fonction d'initialisation_. Elle doit être pure, ne doit pas prendre d'argument, et doit retourner une valeur qui peut être de n'importe quel type. React appellera votre fonction d'initialisation en initialisant le composant, et stockera sa valeur de retour dans votre état initial. [Voir un exemple ci-dessous](#avoiding-recreating-the-initial-state). -#### Returns {/*returns*/} +#### Valeur renvoyée {/*returns*/} -`useState` returns an array with exactly two values: +`useState` retourne un tableau avec exactement deux valeurs : -1. The current state. During the first render, it will match the `initialState` you have passed. -2. The [`set` function](#setstate) that lets you update the state to a different value and trigger a re-render. +1. L'état courant. Lors du premier rendu, ce sera l'`initialState` que vous avez passé en argument. +2. La [fonction de mise à jour](#setstate). Elle vous permet de mettre à jour l'état avec une valeur différente et de déclencher un nouveau rendu. -#### Caveats {/*caveats*/} +#### Limitations {/*caveats*/} -* `useState` is a Hook, so you can only call it **at the top level of your component** or your own Hooks. You can't call it inside loops or conditions. If you need that, extract a new component and move the state into it. -* In Strict Mode, React will **call your initializer function twice** in order to [help you find accidental impurities.](#my-initializer-or-updater-function-runs-twice) This is development-only behavior and does not affect production. If your initializer function is pure (as it should be), this should not affect the behavior. The result from one of the calls will be ignored. +* `useState` est un Hook, vous ne pouvez donc l’appeler qu'**à la racine de votre composant** ou de vos propres Hooks. Vous ne pouvez pas l’appeler à l’intérieur de boucles ou de conditions. Si nécessaire, extrayez un nouveau composant et déplacez l'état dans celui-ci. +* En mode strict, React **appellera votre fonction d'initialisation deux fois** afin de vous aider à [détecter des impuretés accidentelles](#my-initializer-or-updater-function-runs-twice). Ce comportement est uniquement présent en mode développement et n'affecte pas la production. Si votre fonction d'initialisation est pure (ce qui devrait être le cas), ça ne devrait pas affecter le comportement. Le résultat d'un des appels sera ignoré. --- -### `set` functions, like `setSomething(nextState)` {/*setstate*/} +### Les fonctions de mise à jour, comme `setSomething(nextState)` {/*setstate*/} -The `set` function returned by `useState` lets you update the state to a different value and trigger a re-render. You can pass the next state directly, or a function that calculates it from the previous state: +La fonction de mise à jour renvoyée par `useState` permet de mettre à jour l'état avec une valeur différente et de déclencher un nouveau rendu. Vous pouvez passer le prochain état directement, ou passer une fonction qui le calcule sur base de l'état précédent : ```js const [name, setName] = useState('Edward'); function handleClick() { - setName('Taylor'); + setName('Clara'); setAge(a => a + 1); // ... ``` -#### Parameters {/*setstate-parameters*/} +#### Paramètres {/*setstate-parameters*/} -* `nextState`: The value that you want the state to be. It can be a value of any type, but there is a special behavior for functions. - * If you pass a function as `nextState`, it will be treated as an _updater function_. It must be pure, should take the pending state as its only argument, and should return the next state. React will put your updater function in a queue and re-render your component. During the next render, React will calculate the next state by applying all of the queued updaters to the previous state. [See an example below.](#updating-state-based-on-the-previous-state) +* `nextState`: La valeur désirée de l'état. Elle peut être de n'importe quel type, mais les fonctions reçoivent un traitement spécifique. + * Si vous passez une fonction en tant que `nextState`, elle sera traitée comme une _fonction de mise à jour_. Elle doit être pure, doit prendre l'état en attente comme unique argument, et doit retourner le prochain état. React placera votre fonction de mise à jour dans une file d'attente et fera un nouveau rendu de votre composant. Pendant ce prochain rendu, React calculera le prochain état en appliquant toutes les fonctions de mise à jour l'une après l'autre, en commençant avec l'état précédent. [Voir un exemple ci-dessous](#updating-state-based-on-the-previous-state). -#### Returns {/*setstate-returns*/} +#### Valeur renvoyée {/*setstate-returns*/} -`set` functions do not have a return value. +Les fonctions de mise à jour (celles renvoyées par `useState`) n'ont pas de valeur de retour. -#### Caveats {/*setstate-caveats*/} +#### Limitations {/*setstate-caveats*/} -* The `set` function **only updates the state variable for the *next* render**. If you read the state variable after calling the `set` function, [you will still get the old value](#ive-updated-the-state-but-logging-gives-me-the-old-value) that was on the screen before your call. +* La fonction de mise à jour **ne met à jour que les variables d'état pour le *prochain* rendu**. Si vous lisez la variable d'état après avoir appelé la fonction de mise à jour, [vous obtiendrez la même ancienne valeur](#ive-updated-the-state-but-logging-gives-me-the-old-value) qui était sur votre écran avant l'appel. -* If the new value you provide is identical to the current `state`, as determined by an [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) comparison, React will **skip re-rendering the component and its children.** This is an optimization. Although in some cases React may still need to call your component before skipping the children, it shouldn't affect your code. +* Si la nouvelle valeur que vous donnez est identique au `state` actuel, en comparant au moyen de [`Object.is`](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Object/is), React **ne fera pas un nouveau rendu de ce composant et de ses enfants**. Il s'agit d'une optimisation. Même si, dans certains cas, React a tout de même besoin d'appeler votre composant sans faire de rendu de ses enfants, ça ne devrait pas affecter votre code. -* React [batches state updates.](/learn/queueing-a-series-of-state-updates) It updates the screen **after all the event handlers have run** and have called their `set` functions. This prevents multiple re-renders during a single event. In the rare case that you need to force React to update the screen earlier, for example to access the DOM, you can use [`flushSync`.](/reference/react-dom/flushSync) +* React [met à jour les états par lots](/learn/queueing-a-series-of-state-updates). Il met à jour l'écran **après que tous les gestionnaires d'événements ont été lancés** et qu'ils auront appelé leurs fonctions de mise à jour. Ça évite des rendus inutiles suite à un unique événement. Dans les rares cas où vous auriez besoin de forcer React à mettre à jour l'écran plus tôt, par exemple pour accéder au DOM, vous pouvez utiliser [`flushSync`](/reference/react-dom/flushSync). -* Calling the `set` function *during rendering* is only allowed from within the currently rendering component. React will discard its output and immediately attempt to render it again with the new state. This pattern is rarely needed, but you can use it to **store information from the previous renders**. [See an example below.](#storing-information-from-previous-renders) +* Il est possible d'appeler la fonction de mise à jour *pendant le rendu*, mais uniquement au sein du composant en cours de rendu. React ignorera le JSX résultat pour refaire immédiatement un rendu avec le nouvel état. Cette approche est rarement nécessaire, mais vous pouvez l'utiliser pour **stocker des informations des précédents rendus**. [Voir un exemple ci-dessous](#storing-information-from-previous-renders). -* In Strict Mode, React will **call your updater function twice** in order to [help you find accidental impurities.](#my-initializer-or-updater-function-runs-twice) This is development-only behavior and does not affect production. If your updater function is pure (as it should be), this should not affect the behavior. The result from one of the calls will be ignored. +* En mode strict, React **appellera votre fonction d'initialisation deux fois** afin de vous aider à [détecter des impuretés accidentelles](#my-initializer-or-updater-function-runs-twice). Ce comportement est spécifique au mode développement et n'affecte pas la production. Si votre fonction de mise à jour est pure (ce qui devrait être le cas), ça ne devrait pas affecter le comportement. Le résultat d'un des appels sera ignoré. --- -## Usage {/*usage*/} +## Utilisation {/*usage*/} -### Adding state to a component {/*adding-state-to-a-component*/} +### Ajouter un état à un composant {/*adding-state-to-a-component*/} -Call `useState` at the top level of your component to declare one or more [state variables.](/learn/state-a-components-memory) +Appelez `useState` à la racine de votre composant pour déclarer une ou plusieurs [variables d'état](/learn/state-a-components-memory). -```js [[1, 4, "age"], [2, 4, "setAge"], [3, 4, "42"], [1, 5, "name"], [2, 5, "setName"], [3, 5, "'Taylor'"]] +```js [[1, 4, "age"], [2, 4, "setAge"], [3, 4, "42"], [1, 5, "name"], [2, 5, "setName"], [3, 5, "'Clara'"]] import { useState } from 'react'; function MyComponent() { const [age, setAge] = useState(42); - const [name, setName] = useState('Taylor'); + const [name, setName] = useState('Clara'); // ... ``` -The convention is to name state variables like `[something, setSomething]` using [array destructuring.](https://javascript.info/destructuring-assignment) +Par convention, on nomme les variables d'état comme suit : `[something, setSomething]`, en utilisant la [déstructuration positionnelle](https://fr.javascript.info/destructuring-assignment). -`useState` returns an array with exactly two items: +`useState` renvoie un tableau avec exactement deux valeurs : -1. The current state of this state variable, initially set to the initial state you provided. -2. The `set` function that lets you change it to any other value in response to interaction. +1. L'état courant de cette variable d'état, initialement le même que l'état initial que vous avez passé en entrée. +2. La fonction de mise à jour qui vous permet d'en modifier la valeur lors d'une interaction. -To update what’s on the screen, call the `set` function with some next state: +Pour mettre à jour l'affichage, appelez la fonction de mise à jour avec le prochain état : ```js [[2, 2, "setName"]] function handleClick() { @@ -121,28 +121,28 @@ function handleClick() { } ``` -React will store the next state, render your component again with the new values, and update the UI. +React stockera ce prochain état, fera un nouveau rendu de votre composant avec les nouvelles valeurs, et mettra à jour l'interface utilisateur *(UI pour User Interface, NdT)*. -Calling the `set` function [**does not** change the current state in the already executing code](#ive-updated-the-state-but-logging-gives-me-the-old-value): +Appeler la fonction de mise à jour [**ne change pas** l'état actuel dans le code en train d'être exécuté](#ive-updated-the-state-but-logging-gives-me-the-old-value) : ```js {3} function handleClick() { setName('Robin'); - console.log(name); // Still "Taylor"! + console.log(name); // Toujours "Clara" ! } ``` -It only affects what `useState` will return starting from the *next* render. +Elle n'affecte que ce que `useState` renverra à partir du *prochain* rendu. - + -#### Counter (number) {/*counter-number*/} +#### Compteur (nombre) {/*counter-number*/} -In this example, the `count` state variable holds a number. Clicking the button increments it. +Dans cet exemple, la variable d'état `count` contient un nombre. Elle est incrémentée en cliquant sur un bouton. @@ -158,7 +158,7 @@ export default function Counter() { return ( ); } @@ -168,9 +168,9 @@ export default function Counter() { -#### Text field (string) {/*text-field-string*/} +#### Champ de saisie (chaîne de caractères) {/*text-field-string*/} -In this example, the `text` state variable holds a string. When you type, `handleChange` reads the latest input value from the browser input DOM element, and calls `setText` to update the state. This allows you to display the current `text` below. +Dans cet exemple, la variable d'état `text` contient une chaîne de caractères. Lors de la frappe, `handleChange` lit la dernière valeur du champ de saisie dans le DOM, et appelle `setText` pour mettre à jour l'état. Ça vous permet d'afficher le `text` courant en dessous. @@ -178,7 +178,7 @@ In this example, the `text` state variable holds a string. When you type, `handl import { useState } from 'react'; export default function MyInput() { - const [text, setText] = useState('hello'); + const [text, setText] = useState('bonjour'); function handleChange(e) { setText(e.target.value); @@ -187,9 +187,9 @@ export default function MyInput() { return ( <> -

You typed: {text}

- ); @@ -200,9 +200,9 @@ export default function MyInput() { -#### Checkbox (boolean) {/*checkbox-boolean*/} +#### Case à cocher (booléen) {/*checkbox-boolean*/} -In this example, the `liked` state variable holds a boolean. When you click the input, `setLiked` updates the `liked` state variable with whether the browser checkbox input is checked. The `liked` variable is used to render the text below the checkbox. +Dans cet exemple, la variable d'état `liked` contient un booléen. Lorsque vous cliquez sur la case, `setLiked` met à jour la variable d'état `liked` selon que la case est cochée ou non. La variable `liked` est utilisée dans le rendu du texte sous la case à cocher. @@ -224,9 +224,9 @@ export default function MyCheckbox() { checked={liked} onChange={handleChange} /> - I liked this + J’ai aimé -

You {liked ? 'liked' : 'did not like'} this.

+

Vous {liked ? 'avez' : 'n’avez pas'} aimé.

); } @@ -236,9 +236,9 @@ export default function MyCheckbox() { -#### Form (two variables) {/*form-two-variables*/} +#### Formulaire (deux variables) {/*form-two-variables*/} -You can declare more than one state variable in the same component. Each state variable is completely independent. +Vous pouvez déclarer plus d'une variable d'état dans le même composant. Chaque variable d'état est complètement indépendante des autres. @@ -246,7 +246,7 @@ You can declare more than one state variable in the same component. Each state v import { useState } from 'react'; export default function Form() { - const [name, setName] = useState('Taylor'); + const [name, setName] = useState('Clara'); const [age, setAge] = useState(42); return ( @@ -256,9 +256,9 @@ export default function Form() { onChange={e => setName(e.target.value)} /> -

Hello, {name}. You are {age}.

+

Bonjour, {name}. Vous avez {age} ans.

); } @@ -276,9 +276,9 @@ button { display: block; margin-top: 10px; } --- -### Updating state based on the previous state {/*updating-state-based-on-the-previous-state*/} +### Mettre à jour l'état sur base de l'état précédent {/*updating-state-based-on-the-previous-state*/} -Suppose the `age` is `42`. This handler calls `setAge(age + 1)` three times: +Supposons que `age` vaille `42`. Ce gestionnaire appelle `setAge(age + 1)` trois fois : ```js function handleClick() { @@ -288,9 +288,9 @@ function handleClick() { } ``` -However, after one click, `age` will only be `43` rather than `45`! This is because calling the `set` function [does not update](/learn/state-as-a-snapshot) the `age` state variable in the already running code. So each `setAge(age + 1)` call becomes `setAge(43)`. +Cependant, après un click, `age` ne va valoir que `43`, plutôt que `45` ! C'est parce qu'appeler la fonction de mise à jour [ne met pas à jour](/learn/state-as-a-snapshot) la variable d'état `age` dans le code en cours d'exécution. Donc, chaque appel à `setAge(age + 1)` devient `setAge(43)`. -To solve this problem, **you may pass an *updater function*** to `setAge` instead of the next state: +Pour résoudre ce problème, **vous devez passer une *fonction de mise à jour*** à `setAge` au lieu du prochain état : ```js [[1, 2, "a", 0], [2, 2, "a + 1"], [1, 3, "a", 0], [2, 3, "a + 1"], [1, 4, "a", 0], [2, 4, "a + 1"]] function handleClick() { @@ -300,39 +300,39 @@ function handleClick() { } ``` -Here, `a => a + 1` is your updater function. It takes the pending state and calculates the next state from it. +Ici, `a => a + 1` est votre fonction de mise à jour. Elle prend l'état en attente et calcule à partir de celui-ci le prochain état. -React puts your updater functions in a [queue.](/learn/queueing-a-series-of-state-updates) Then, during the next render, it will call them in the same order: +React met vos fonctions de mise à jour dans une [file d'attente](/learn/queueing-a-series-of-state-updates). Ensuite, pendant le prochain rendu, il va les appeler dans le même ordre : -1. `a => a + 1` will receive `42` as the pending state and return `43` as the next state. -1. `a => a + 1` will receive `43` as the pending state and return `44` as the next state. -1. `a => a + 1` will receive `44` as the pending state and return `45` as the next state. +1. `a => a + 1` recevra un état en attente à `42` et renverra `43` comme prochain état. +1. `a => a + 1` recevra un état en attente à `43` et renverra `44` comme prochain état. +1. `a => a + 1` recevra un état en attente à `44` et renverra `45` comme prochain état. -There are no other queued updates, so React will store `45` as the current state in the end. +Il n'y a pas d'autres mises à jour en file d'attente, React stockera donc au final `45` comme état courant. -By convention, it's common to name the pending state argument for the first letter of the state variable name, like `a` for `age`. However, you may also call it like `prevAge` or something else that you find clearer. +La convention veut qu'on nomme l'argument de l'état en attente selon la première lettre du nom de la variable d'état, comme `a` pour `age`. Cependant, vous pouvez tout aussi bien le nommer `prevAge`, ou quelque chose d'autre que vous trouveriez plus explicite. -React may [call your updaters twice](#my-initializer-or-updater-function-runs-twice) in development to verify that they are [pure.](/learn/keeping-components-pure) +En développement, React pourra [appeler vos mises à jour deux fois](#my-initializer-or-updater-function-runs-twice) pour vérifier qu'elles sont [pures](/learn/keeping-components-pure). -#### Is using an updater always preferred? {/*is-using-an-updater-always-preferred*/} +#### Est-il toujours préférable d'utiliser une fonction de mise à jour ? {/*is-using-an-updater-always-preferred*/} -You might hear a recommendation to always write code like `setAge(a => a + 1)` if the state you're setting is calculated from the previous state. There is no harm in it, but it is also not always necessary. +Certains vous recommandront peut-être de toujours écrire votre code de cette manière, si l'état que vous mettez à jour est calculé depuis l'état précédent : `setAge(a => a + 1)`. Il n'y a aucun mal à ça, mais ce n'est pas toujours nécessaire. -In most cases, there is no difference between these two approaches. React always makes sure that for intentional user actions, like clicks, the `age` state variable would be updated before the next click. This means there is no risk of a click handler seeing a "stale" `age` at the beginning of the event handler. +Dans la plupart des cas, il n'y a aucune différence entre ces deux approches. React s'assurera toujours, pour les actions intentionnelles des utilisateurs, que l'état `age` sera à jour pour le prochain click. Il n'y a donc aucun risque qu'un gestionnaire de clic voie un `age` "obsolète" au début d'un écouteur d'événement. -However, if you do multiple updates within the same event, updaters can be helpful. They're also helpful if accessing the state variable itself is inconvenient (you might run into this when optimizing re-renders). +Cependant, si vous effectuez plusieurs mises à jour pour le même événement, les fonctions de mises à jours peuvent être utiles. Elles sont également utiles s'il n'est pas pratique d'accéder à la variable d'état elle-même (vous pourrez rencontrer ce cas lorsque vous cherchez à optimiser les rendus). -If you prefer consistency over slightly more verbose syntax, it's reasonable to always write an updater if the state you're setting is calculated from the previous state. If it's calculated from the previous state of some *other* state variable, you might want to combine them into one object and [use a reducer.](/learn/extracting-state-logic-into-a-reducer) +Si vous souhaitez rester cohérent·e dans le style employé, au prix d'une syntaxe légèrement plus verbeuse, vous pouvez choisir de toujours recourir à une fonction de mise à jour lorsque l'état que vous mettez à jour est calculé à partir de l'état précédent. S'il est calculé depuis l'état précédent d'une *autre* variable d'état, vous pourrez peut-être les combiner en un seul objet et [utiliser un réducteur](/learn/extracting-state-logic-into-a-reducer). - + -#### Passing the updater function {/*passing-the-updater-function*/} +#### Passer la fonction de mise à jour {/*passing-the-updater-function*/} -This example passes the updater function, so the "+3" button works. +Cet exemple passe la fonction de mise à jour, du coup le bouton "+3" fonctionne. @@ -348,7 +348,7 @@ export default function Counter() { return ( <> -

Your age: {age}

+

Votre âge : {age}

+ }}>Ajouter ) } @@ -746,7 +746,7 @@ function Task({ todo, onChange, onDelete }) { }); }} /> ); @@ -755,7 +755,7 @@ function Task({ todo, onChange, onDelete }) { <> {todo.title} ); @@ -774,7 +774,7 @@ function Task({ todo, onChange, onDelete }) { /> {todoContent} ); @@ -791,9 +791,9 @@ ul, li { margin: 0; padding: 0; } -#### Writing concise update logic with Immer {/*writing-concise-update-logic-with-immer*/} +#### Du code de mise à jour plus concis grâce à Immer {/*writing-concise-update-logic-with-immer*/} -If updating arrays and objects without mutation feels tedious, you can use a library like [Immer](https://github.com/immerjs/use-immer) to reduce repetitive code. Immer lets you write concise code as if you were mutating objects, but under the hood it performs immutable updates: +Si le fait de mettre à jour des tableaux et des objets en préservant l'immutabilité vous paraît fastidieux, vous pouvez utiliser une bibliothèque pour réduire le code répétitif, comme [Immer](https://github.com/immerjs/use-immer). Immer vous permet d'écrire du code concis comme si vous modifiiez les objets, mais en pratique il préserve l'immutabilité : @@ -822,8 +822,8 @@ export default function BucketList() { return ( <> -

Art Bucket List

-

My list of art to see:

+

Art à voir

+

Ma liste d'œuvres d'art à voir :

@@ -882,9 +882,9 @@ function ItemList({ artworks, onToggle }) { --- -### Avoiding recreating the initial state {/*avoiding-recreating-the-initial-state*/} +### Éviter de recalculer l'état initial {/*avoiding-recreating-the-initial-state*/} -React saves the initial state once and ignores it on the next renders. +React sauvegarde l'état initial et l'ignore lors des rendus ultérieurs. ```js function TodoList() { @@ -892,9 +892,9 @@ function TodoList() { // ... ``` -Although the result of `createInitialTodos()` is only used for the initial render, you're still calling this function on every render. This can be wasteful if it's creating large arrays or performing expensive calculations. +Même si le résultat de `createInitialTodos()` est utilisé seulement pour le rendu initial, vous appelez tout de même cette fonction à chaque rendu. Ça peut gâcher les performances si vous créez de grands tableaux ou effectuez des calculs coûteux. -To solve this, you may **pass it as an _initializer_ function** to `useState` instead: +Pour résoudre cette problématique, vous pouvez **passer plutôt une fonction _d'initialisation_** à `useState` : ```js function TodoList() { @@ -902,15 +902,15 @@ function TodoList() { // ... ``` -Notice that you’re passing `createInitialTodos`, which is the *function itself*, and not `createInitialTodos()`, which is the result of calling it. If you pass a function to `useState`, React will only call it during initialization. +Remarquez que vous passez désormais `createInitialTodos`, c'est-à-dire *la fonction elle-même*, au lieu de `createInitialTodos()`, qui est le résultat de l'appel. Si vous passez une fonction à `useState`, React ne l'appellera que pendant l'initialisation. -React may [call your initializers twice](#my-initializer-or-updater-function-runs-twice) in development to verify that they are [pure.](/learn/keeping-components-pure) +React pourra [appeler vos fonctions d'initialisations deux fois](#my-initializer-or-updater-function-runs-twice) afin de vérifier qu'elles sont [pures](/learn/keeping-components-pure). - + -#### Passing the initializer function {/*passing-the-initializer-function*/} +#### Passer la fonction d'initialisation {/*passing-the-initializer-function*/} -This example passes the initializer function, so the `createInitialTodos` function only runs during initialization. It does not run when component re-renders, such as when you type into the input. +Cet exemple passe la fonction `createInitialTodos` en tant que fonction d'initialisation, afin qu'elle ne soit lancée que lors de l'initialisation. Elle n'est pas lancée quand le composant effectue un nouveau rendu, par exemple lorsque vous tapez dans le champ de saisie. @@ -922,7 +922,7 @@ function createInitialTodos() { for (let i = 0; i < 50; i++) { initialTodos.push({ id: i, - text: 'Item ' + (i + 1) + text: 'Élément ' + (i + 1) }); } return initialTodos; @@ -944,7 +944,7 @@ export default function TodoList() { id: todos.length, text: text }, ...todos]); - }}>Add + }}>Ajouter
    {todos.map(item => (
  • @@ -961,9 +961,9 @@ export default function TodoList() { -#### Passing the initial state directly {/*passing-the-initial-state-directly*/} +#### Passer directement l'état initial {/*passing-the-initial-state-directly*/} -This example **does not** pass the initializer function, so the `createInitialTodos` function runs on every render, such as when you type into the input. There is no observable difference in behavior, but this code is less efficient. +Cet exemple **ne passe pas** de fonction d'initialisation, de sorte que `createInitialTodos` est appelée à chaque rendu, y compris lorsque vous tapez dans le champ de saisie. Il n'y a pas de différence perceptible de comportement, mais le code est moins efficace. @@ -975,7 +975,7 @@ function createInitialTodos() { for (let i = 0; i < 50; i++) { initialTodos.push({ id: i, - text: 'Item ' + (i + 1) + text: 'Élément ' + (i + 1) }); } return initialTodos; @@ -997,7 +997,7 @@ export default function TodoList() { id: todos.length, text: text }, ...todos]); - }}>Add + }}>Ajouter
      {todos.map(item => (
    • @@ -1018,13 +1018,13 @@ export default function TodoList() { --- -### Resetting state with a key {/*resetting-state-with-a-key*/} +### Réinitialiser l'état avec une clé {/*resetting-state-with-a-key*/} -You'll often encounter the `key` attribute when [rendering lists.](/learn/rendering-lists) However, it also serves another purpose. +Vous rencontrerez souvent la *prop* `key` dans des [rendus de listes](/learn/rendering-lists). Sachez qu'elle a une autre utilité. -You can **reset a component's state by passing a different `key` to a component.** In this example, the Reset button changes the `version` state variable, which we pass as a `key` to the `Form`. When the `key` changes, React re-creates the `Form` component (and all of its children) from scratch, so its state gets reset. +Vous pouvez **réinitialiser l'état d'un composant en lui passant une `key` différente**. Dans cet exemple, le bouton Réinitialiser change la variable d'état `version`, laquelle est passée comme `key` au `Form`. Quand la `key` change, React recrée le composant `Form` (et tous ses enfants) à partir de zéro, ce qui réinitialise son état. -Read [preserving and resetting state](/learn/preserving-and-resetting-state) to learn more. +Consultez [Préserver et réinitialiser l'état](/learn/preserving-and-resetting-state) pour en savoir plus. @@ -1040,14 +1040,14 @@ export default function App() { return ( <> - +
      ); } function Form() { - const [name, setName] = useState('Taylor'); + const [name, setName] = useState('Clara'); return ( <> @@ -1055,7 +1055,7 @@ function Form() { value={name} onChange={e => setName(e.target.value)} /> -

      Hello, {name}.

      +

      Bonjour, {name}.

      ); } @@ -1069,19 +1069,19 @@ button { display: block; margin-bottom: 20px; } --- -### Storing information from previous renders {/*storing-information-from-previous-renders*/} +### Stocker les informations des rendus précédents {/*storing-information-from-previous-renders*/} -Usually, you will update state in event handlers. However, in rare cases you might want to adjust state in response to rendering -- for example, you might want to change a state variable when a prop changes. +La plupart du temps, vous mettrez à jour les états dans des gestionnaires d'événements. Cependant, dans de rares cas, vous pourriez vouloir ajuster l'état en fonction du rendu -- par exemple, pour modifier une variable d'état quand une propriété change. -In most cases, you don't need this: +Dans la plupart des cas, vous n'en avez en réalité pas besoin : -* **If the value you need can be computed entirely from the current props or other state, [remove that redundant state altogether.](/learn/choosing-the-state-structure#avoid-redundant-state)** If you're worried about recomputing too often, the [`useMemo` Hook](/reference/react/useMemo) can help. -* If you want to reset the entire component tree's state, [pass a different `key` to your component.](#resetting-state-with-a-key) -* If you can, update all the relevant state in the event handlers. +* **Si la valeur dont vous avez besoin peut être totalement calculée à partir des propriétés actuelles ou d'un autre état, [supprimez carrément cette variable d'état redondante](/learn/choosing-the-state-structure#avoid-redundant-state)**. Si vous craignez d'effectuer alors de nouveaux calculs trop fréquemment, le [Hook `useMemo`](/reference/react/useMemo) peut vous aider. +* Si vous voulez réinitialiser l'intégralité des états du composant et de ses enfants, [passez une `key` différente à votre composant](#resetting-state-with-a-key). +* Si vous le pouvez, mettez à jour tous les états pertinents dans des gestionnaires d'événements. -In the rare case that none of these apply, there is a pattern you can use to update state based on the values that have been rendered so far, by calling a `set` function while your component is rendering. +Dans de rares autres cas, il existe une approche que vous pouvez utiliser pour mettre à jour un état sur la base des valeurs actuelles du rendu : appelez sa fonction de mise à jour pendant le rendu de votre composant. -Here's an example. This `CountLabel` component displays the `count` prop passed to it: +Voici un exemple. Ce composant `CountLabel` affiche une prop `count` qui lui est passée : ```js CountLabel.js export default function CountLabel({ count }) { @@ -1089,7 +1089,7 @@ export default function CountLabel({ count }) { } ``` -Say you want to show whether the counter has *increased or decreased* since the last change. The `count` prop doesn't tell you this -- you need to keep track of its previous value. Add the `prevCount` state variable to track it. Add another state variable called `trend` to hold whether the count has increased or decreased. Compare `prevCount` with `count`, and if they're not equal, update both `prevCount` and `trend`. Now you can show both the current count prop and *how it has changed since the last render*. +Mettons que vous vouliez indiquer si le compteur a *augmenté ou diminué* depuis le dernier changement. La prop `count` ne vous permet pas de le savoir -- vous avez besoin de garder trace de sa dernière valeur. Ajoutez la variable d'état `prevCount` pour y parvenir. Puis ajoutez une autre variable d'état appelée `trend` qui permet de savoir si le compteur a augmenté ou diminué. Comparez `prevCount` avec `count`, et, s'ils ne sont pas égaux, mettez à jour `prevCount` et `trend`. Vous pouvez maintenant afficher tant la prop du compteur courant que *la façon dont elle a changé depuis le dernier rendu*. @@ -1102,10 +1102,10 @@ export default function App() { return ( <> @@ -1121,12 +1121,12 @@ export default function CountLabel({ count }) { const [trend, setTrend] = useState(null); if (prevCount !== count) { setPrevCount(count); - setTrend(count > prevCount ? 'increasing' : 'decreasing'); + setTrend(count > prevCount ? 'augmenté' : 'diminué'); } return ( <>

      {count}

      - {trend &&

      The count is {trend}

      } + {trend &&

      Le compteur a {trend}

      } ); } @@ -1138,34 +1138,34 @@ button { margin-bottom: 10px; }
      -Note that if you call a `set` function while rendering, it must be inside a condition like `prevCount !== count`, and there must be a call like `setPrevCount(count)` inside of the condition. Otherwise, your component would re-render in a loop until it crashes. Also, you can only update the state of the *currently rendering* component like this. Calling the `set` function of *another* component during rendering is an error. Finally, your `set` call should still [update state without mutation](#updating-objects-and-arrays-in-state) -- this doesn't mean you can break other rules of [pure functions.](/learn/keeping-components-pure) +Notez que si vous appelez une fonction de mise à jour pendant le rendu, elle doit être assujettie à une condition, telle que `prevCount !== count`, laquelle contrôle l'appel, tel que `setPrevCount(count)`. À défaut, votre composant effectuera des rendus en boucle jusqu'à cause un plantage. De plus, vous ne pouvez mettre ainsi à jour que l'état du composant *en cours de rendu*. Appeler une fonction de mise à jour issue d'un *autre* composant pendant le rendu entraîne une erreur. Pour finir, votre appel de mise à jour devrait toujours [mettre à jour l'état sans le modifier](#updating-objects-and-arrays-in-state) -- appeler depuis le rendu ne vous autorise pas à enfreindre les règles des [fonctions pures](/learn/keeping-components-pure). -This pattern can be hard to understand and is usually best avoided. However, it's better than updating state in an effect. When you call the `set` function during render, React will re-render that component immediately after your component exits with a `return` statement, and before rendering the children. This way, children don't need to render twice. The rest of your component function will still execute (and the result will be thrown away). If your condition is below all the Hook calls, you may add an early `return;` to restart rendering earlier. +Cette approche peut être délicate à bien comprendre : la plupart du temps, vous devriez l'éviter. Cependant, c'est toujours mieux que de mettre à jour un état au sein d'un effet. Lorsque vous appelez une fonction de mise à jour pendant le rendu, React effectuera un nouveau rendu de ce composant immédiatement après que votre fonction composant a terminé avec un `return`, avant d'effectuer le rendu de ses enfants. Grâce à ça, les enfants n'auront pas besoin d'effectuer deux rendus. Le reste de votre fonction composant s'exécutera toujours (et le résultat sera jeté). Si votre condition se situe en dessous de tous les appels à des Hooks, vous pouvez même y ajouter un `return;` anticipé pour déclencher le nouveau rendu plus tôt. --- -## Troubleshooting {/*troubleshooting*/} +## Dépannage {/*troubleshooting*/} -### I've updated the state, but logging gives me the old value {/*ive-updated-the-state-but-logging-gives-me-the-old-value*/} +### J'ai mis à jour l'état, mais je vois toujours l'ancienne valeur {/*ive-updated-the-state-but-logging-gives-me-the-old-value*/} -Calling the `set` function **does not change state in the running code**: +Appeler la fonction de mise à jour **ne modifie pas l'état dans le code en cours d"exécution** : ```js {4,5,8} function handleClick() { console.log(count); // 0 - setCount(count + 1); // Request a re-render with 1 - console.log(count); // Still 0! + setCount(count + 1); // Demande un nouveau rendu avec 1 + console.log(count); // Toujours 0 ! setTimeout(() => { - console.log(count); // Also 0! + console.log(count); // Encore 0 ! }, 5000); } ``` -This is because [states behaves like a snapshot.](/learn/state-as-a-snapshot) Updating state requests another render with the new state value, but does not affect the `count` JavaScript variable in your already-running event handler. +C'est parce que l'[état se comporte comme un instantané](/learn/state-as-a-snapshot). Mettre à jour l'état planifie un autre rendu avec la nouvelle valeur d'état, mais n'affecte pas la variable JavaScript `count` dans le gestionnaire d'événements en train de s'exécuter. -If you need to use the next state, you can save it in a variable before passing it to the `set` function: +Si vous avez besoin du prochain état, vous pouvez le sauvegarder dans une variable avant de le passer dans la fonction de mise à jour : ```js const nextCount = count + 1; @@ -1177,19 +1177,19 @@ console.log(nextCount); // 1 --- -### I've updated the state, but the screen doesn't update {/*ive-updated-the-state-but-the-screen-doesnt-update*/} +### J'ai mis à jour l'état, mais l'affichage ne se met pas à jour {/*ive-updated-the-state-but-the-screen-doesnt-update*/} -React will **ignore your update if the next state is equal to the previous state,** as determined by an [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is) comparison. This usually happens when you change an object or an array in state directly: +React **ignorera votre mise à jour si le prochain état est égal à l'état précédent**, en comparant au moyen de [`Object.is`](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/Object/is). Ça arrive généralement lorsque vous modifiez directement un objet ou un tableau dans l'état : ```js -obj.x = 10; // 🚩 Wrong: mutating existing object -setObj(obj); // 🚩 Doesn't do anything +obj.x = 10; // 🚩 Erroné : mutation d’un objet existant +setObj(obj); // 🚩 Ne fait rien ``` -You mutated an existing `obj` object and passed it back to `setObj`, so React ignored the update. To fix this, you need to ensure that you're always [_replacing_ objects and arrays in state instead of _mutating_ them](#updating-objects-and-arrays-in-state): +Vous avez modifié un objet `obj` existant et vous l'avez passé à `setObj`, donc React ignore la mise à jour (c'est la même référence, le même objet en mémoire). Pour corriger ça, vous devez vous assurer de [toujours _remplacer_ les objets et les tableaux de l'état plutôt que les _modifier_](#updating-objects-and-arrays-in-state) : ```js -// ✅ Correct: creating a new object +// ✅ Correct : création d’un nouvel objet setObj({ ...obj, x: 10 @@ -1198,78 +1198,77 @@ setObj({ --- -### I'm getting an error: "Too many re-renders" {/*im-getting-an-error-too-many-re-renders*/} +### J'ai une erreur : "Too many re-renders" {/*im-getting-an-error-too-many-re-renders*/} -You might get an error that says: `Too many re-renders. React limits the number of renders to prevent an infinite loop.` Typically, this means that you're unconditionally setting state *during render*, so your component enters a loop: render, set state (which causes a render), render, set state (which causes a render), and so on. Very often, this is caused by a mistake in specifying an event handler: +Vous verrez peut-être une erreur disant : `Too many re-renders. React limits the number of renders to prevent an infinite loop` _(« Trop re rendus successifs. React limite le nombre de rendus pour éviter une boucle infinie », NdT)_. Ça signifie le plus souvent que vous mettez à jour un état de manière inconditionnelle *pendant le rendu*, de sorte que votre composant entre dans une boucle : rendu, mise à jour de l'état (qui déclenche un rendu), rendu, mise à jour de l'état (qui entraîne un rendu), etc. Le plus souvent, ça vient d'une erreur classique de fourniture d'un gestionnaire d'événement : ```js {1-2} -// 🚩 Wrong: calls the handler during render +// 🚩 Erroné : appelle le gestionnaire pendant le rendu return -// ✅ Correct: passes down the event handler +// ✅ Correct : passe le gestionnaire d’événement return -// ✅ Correct: passes down an inline function +// ✅ Correct : passe une fonction créée à la volée return ``` -If you can't find the cause of this error, click on the arrow next to the error in the console and look through the JavaScript stack to find the specific `set` function call responsible for the error. +Si vous n'arrivez pas à trouver le cause de cette erreur, cliquez dans la console sur la flèche à côté de l'erreur, et examinez votre pile d'appels JavaScript afin d'y repérer la fonction de mise à jour responsable de l'erreur. --- -### My initializer or updater function runs twice {/*my-initializer-or-updater-function-runs-twice*/} +### Ma fonction d'initialisation (ou de mise à jour) est exécutée deux fois {/*my-initializer-or-updater-function-runs-twice*/} -In [Strict Mode](/reference/react/StrictMode), React will call some of your functions twice instead of once: +En [mode strict](/reference/react/StrictMode), React appellera certaines de vos fonctions plutôt deux fois qu'une : ```js {2,5-6,11-12} function TodoList() { - // This component function will run twice for every render. + // Cette fonction composant sera appelée deux fois par rendu. const [todos, setTodos] = useState(() => { - // This initializer function will run twice during initialization. + // Cette fonction d'initialisation sera appelée deux fois par rendu. return createTodos(); }); function handleClick() { setTodos(prevTodos => { - // This updater function will run twice for every click. + // Cette fonction de mise à jour sera appelée deux fois par clic. return [...prevTodos, createTodo()]; }); } // ... ``` -This is expected and shouldn't break your code. +C'est voulu, et ça ne devrait pas casser votre code. -This **development-only** behavior helps you [keep components pure.](/learn/keeping-components-pure) React uses the result of one of the calls, and ignores the result of the other call. As long as your component, initializer, and updater functions are pure, this shouldn't affect your logic. However, if they are accidentally impure, this helps you notice the mistakes. +Ce comportement, **uniquement présent en développement**, vous aide à [garder vos composants purs](/learn/keeping-components-pure). React utilise le résultat d'un des appels et ignore le résultat de l'autre. Tant que vos composants, vos fonctions d'initialisation, et vos fonctions de mise à jour sont pures, ça ne devrait pas affecter le comportement. Cependant, si elles sont accidentellement impures, ça vous aide à détecter le problème. -For example, this impure updater function mutates an array in state: +Par exemple, cette fonction de mise à jour impure modifie directement un tableau dans un état : ```js {2,3} setTodos(prevTodos => { - // 🚩 Mistake: mutating state + // 🚩 Erreur : modification en place de l'état prevTodos.push(createTodo()); }); ``` - -Because React calls your updater function twice, you'll see the todo was added twice, so you'll know that there is a mistake. In this example, you can fix the mistake by [replacing the array instead of mutating it](#updating-objects-and-arrays-in-state): +Comme React a appelé votre fonction de mise à jour à deux reprises, vous verrez que la tâche a été ajoutée deux fois, et vous saurez qu'il y a une erreur. Dans cet exemple, vous pouvez corriger l'erreur en [remplaçant le tableau, plutôt que de le modifier](#updating-objects-and-arrays-in-state) : ```js {2,3} setTodos(prevTodos => { - // ✅ Correct: replacing with new state + // ✅ Correct : remplacement par un nouvel état return [...prevTodos, createTodo()]; }); ``` -Now that this updater function is pure, calling it an extra time doesn't make a difference in behavior. This is why React calling it twice helps you find mistakes. **Only component, initializer, and updater functions need to be pure.** Event handlers don't need to be pure, so React will never call your event handlers twice. +Maintenant que cette fonction de mise à jour est pure, l'appeler une fois de plus n'entraîne aucune différence de comportement. C'est en cela que le double appel par React vous aide à détecter les problèmes. **Seuls les composants, les fonctions d'initialisation et les fonctions de mise à jour doivent être purs**. Les gestionnaires d'événements n'ont pas besoin d'être purs, aussi React ne les appellera jamais deux fois. -Read [keeping components pure](/learn/keeping-components-pure) to learn more. +Consultez [Garder les composants purs](/learn/keeping-components-pure) pour en savoir plus. --- -### I'm trying to set state to a function, but it gets called instead {/*im-trying-to-set-state-to-a-function-but-it-gets-called-instead*/} +### J'essaie de placer une fonction dans un état, mais elle est appelée directement {/*im-trying-to-set-state-to-a-function-but-it-gets-called-instead*/} -You can't put a function into state like this: +Vous ne pouvez pas mettre une fonction dans un état comme ceci : ```js const [fn, setFn] = useState(someFunction); @@ -1279,7 +1278,7 @@ function handleClick() { } ``` -Because you're passing a function, React assumes that `someFunction` is an [initializer function](#avoiding-recreating-the-initial-state), and that `someOtherFunction` is an [updater function](#updating-state-based-on-the-previous-state), so it tries to call them and store the result. To actually *store* a function, you have to put `() =>` before them in both cases. Then React will store the functions you pass. +Comme vous passez une fonction, React part du principe que `someFunction` est une [fonction d'initialisation](#avoiding-recreating-the-initial-state), et que `someOtherFunction` est une [fonction de mise à jour](#updating-state-based-on-the-previous-state) ; il va donc les appeler pour stocker leurs résultats. Afin de *stocker* effectivement une fonction, dans les deux cas vous devrez la préfixer par `() =>`. Dans ce cas, React stockera les fonctions que vous passez. ```js {1,4} const [fn, setFn] = useState(() => someFunction);