diff --git a/src/content/learn/responding-to-events.md b/src/content/learn/responding-to-events.md index 4450c4613..cf64a3314 100644 --- a/src/content/learn/responding-to-events.md +++ b/src/content/learn/responding-to-events.md @@ -1,24 +1,24 @@ --- -title: Responding to Events +title: Réagir aux événements --- -React lets you add *event handlers* to your JSX. Event handlers are your own functions that will be triggered in response to interactions like clicking, hovering, focusing form inputs, and so on. +React vous permet d’ajouter des *gestionnaires d’événements* à votre JSX. Les gestionnaires d’événements sont vos propres fonctions qui seront déclenchées en réponse aux interactions de l’utilisateur telles que des clics, survols, activations de champs de saisie de formulaires, etc. -* Different ways to write an event handler -* How to pass event handling logic from a parent component -* How events propagate and how to stop them +* Différentes façons d’écrire un gestionnaire d’événement +* Comment passer la logique de gestion d’événement depuis un composant parent +* Comment les événements se propagent et comment les arrêter -## Adding event handlers {/*adding-event-handlers*/} +## Ajouter des gestionnaires d’événements {/*adding-event-handlers*/} -To add an event handler, you will first define a function and then [pass it as a prop](/learn/passing-props-to-a-component) to the appropriate JSX tag. For example, here is a button that doesn't do anything yet: +Pour ajouter un gestionnaire d’événement, vous devrez d’abord définir une fonction et [la passer en tant que prop](/learn/passing-props-to-a-component) à la balise JSX appropriée. Par exemple, voici un bouton qui ne fait rien pour le moment : @@ -26,7 +26,7 @@ To add an event handler, you will first define a function and then [pass it as a export default function Button() { return ( ); } @@ -34,23 +34,23 @@ export default function Button() { -You can make it show a message when a user clicks by following these three steps: +Vous pouvez lui faire afficher un message au clic de l'utilisateur en suivant ces trois étapes : -1. Declare a function called `handleClick` *inside* your `Button` component. -2. Implement the logic inside that function (use `alert` to show the message). -3. Add `onClick={handleClick}` to the ` ); } @@ -62,77 +62,79 @@ button { margin-right: 10px; } -You defined the `handleClick` function and then [passed it as a prop](/learn/passing-props-to-a-component) to ` ); } function UploadButton() { return ( - ); } @@ -207,7 +209,7 @@ function UploadButton() { export default function Toolbar() { return (
- +
); @@ -220,22 +222,22 @@ button { margin-right: 10px; } -Here, the `Toolbar` component renders a `PlayButton` and an `UploadButton`: +Dans cet exemple, le composant `Toolbar` affiche un `PlayButton` et un `UploadButton` : -- `PlayButton` passes `handlePlayClick` as the `onClick` prop to the `Button` inside. -- `UploadButton` passes `() => alert('Uploading!')` as the `onClick` prop to the `Button` inside. +- Dans `PlayButton`, on passe `handlePlayClick` à la prop `onClick` du `Button` qu'il contient. +- Dans `UploadButton`, on passe `() => alert('Téléversement en cours !')` à la prop `onClick` du `Button` qu'il contient. -Finally, your `Button` component accepts a prop called `onClick`. It passes that prop directly to the built-in browser ` - ); @@ -268,9 +270,9 @@ button { margin-right: 10px; } -In this example, ` ); @@ -312,19 +314,19 @@ button { margin-right: 10px; } -Notice how the `App` component does not need to know *what* `Toolbar` will do with `onPlayMovie` or `onUploadImage`. That's an implementation detail of the `Toolbar`. Here, `Toolbar` passes them down as `onClick` handlers to its `Button`s, but it could later also trigger them on a keyboard shortcut. Naming props after app-specific interactions like `onPlayMovie` gives you the flexibility to change how they're used later. - +Remarquez que le composant `App` n’a pas besoin de savoir *ce que fera* `Toolbar` avec `onPlayMovie` ou `onUploadImage`. C’est un détail d’implémentation de `Toolbar`. Ici, `Toolbar` les transmet en tant que gestionnaires `onClick` à ses `Button`s, mais il pourrait également les déclencher ultérieurement avec un raccourci clavier. Nommer les props d’après des interactions spécifiques à l’application telles que `onPlayMovie` vous donne de la flexibilité pour modifier leur utilisation ultérieurement. + -Make sure that you use the appropriate HTML tags for your event handlers. For example, to handle clicks, use [` - ); @@ -355,19 +357,19 @@ button { margin: 5px; } -If you click on either button, its `onClick` will run first, followed by the parent `
`'s `onClick`. So two messages will appear. If you click the toolbar itself, only the parent `
`'s `onClick` will run. +Si vous cliquez sur l’un des boutons, son `onClick` sera exécuté en premier, suivi de l’`onClick` de l’élément parent `
`. Ainsi, deux messages vont apparaître. Si vous cliquez sur la barre d’outils elle-même, seul l’`onClick` de l’élément `
` sera exécuté. -All events propagate in React except `onScroll`, which only works on the JSX tag you attach it to. +Tous les événements se propagent dans React, sauf `onScroll`, qui fonctionne uniquement sur l'élément JSX auquel il est attaché. -### Stopping propagation {/*stopping-propagation*/} +### Arrêter la propagation {/*stopping-propagation*/} -Event handlers receive an **event object** as their only argument. By convention, it's usually called `e`, which stands for "event". You can use this object to read information about the event. +Les gestionnaires d’événements reçoivent un **objet événement** comme seul argument. Par convention, il est généralement appelé `e`, ce qui signifie *“event”* *(« événement », NdT)*. Vous pouvez utiliser cet objet pour obtenir des informations sur l’événement. -That event object also lets you stop the propagation. If you want to prevent an event from reaching parent components, you need to call `e.stopPropagation()` like this `Button` component does: +Cet objet événement vous permet également d’arrêter la propagation. Si vous souhaitez empêcher un événement de se propager vers les composants parents, vous devez appeler `e.stopPropagation()`, comme le fait le composant `Button` : @@ -386,13 +388,13 @@ function Button({ onClick, children }) { export default function Toolbar() { return (
{ - alert('You clicked on the toolbar!'); + alert('Vous avez cliqué sur la barre d’outils !'); }}> - -
); @@ -409,43 +411,43 @@ button { margin: 5px; }
-When you click on a button: +Quand vous cliquez sur un bouton : -1. React calls the `onClick` handler passed to `
``` -Each event propagates in three phases: +Chaque événement se propage en trois phases : -1. It travels down, calling all `onClickCapture` handlers. -2. It runs the clicked element's `onClick` handler. -3. It travels upwards, calling all `onClick` handlers. +1. Il descend depuis la racine, appelant tous les gestionnaires `onClickCapture`. +2. Il exécute le gestionnaire `onClick` de l’élément cliqué. +3. Il remonte, appelant tous les gestionnaires `onClick`. -Capture events are useful for code like routers or analytics, but you probably won't use them in app code. +Les événements de capture sont utiles pour du code tel que les systèmes de routage ou les outils d’analyse, mais vous ne les utiliserez probablement pas dans du code applicatif. -### Passing handlers as alternative to propagation {/*passing-handlers-as-alternative-to-propagation*/} +### Passer des gestionnaires d’événements au lieu de propager {/*passing-handlers-as-alternative-to-propagation*/} -Notice how this click handler runs a line of code _and then_ calls the `onClick` prop passed by the parent: +Vous remarquerez ci-dessous que le gestionnaire du clic exécute une ligne de code _puis_ appelle la prop `onClick` passée par le parent : ```js {4,5} function Button({ onClick, children }) { @@ -460,22 +462,22 @@ function Button({ onClick, children }) { } ``` -You could add more code to this handler before calling the parent `onClick` event handler, too. This pattern provides an *alternative* to propagation. It lets the child component handle the event, while also letting the parent component specify some additional behavior. Unlike propagation, it's not automatic. But the benefit of this pattern is that you can clearly follow the whole chain of code that executes as a result of some event. +Vous pourriez ajouter davantage de code à ce gestionnaire avant d’appeler le gestionnaire d’événement `onClick` du parent. Cette approche offre une *alternative* à la propagation. Elle permet au composant enfant de gérer l’événement tout en permettant au composant parent de spécifier un comportement supplémentaire. Contrairement à la propagation, ce n’est pas automatique. Mais l’avantage de ce concept tient à ce que vous pouvez suivre clairement l’ensemble de la chaîne de code qui s’exécute en réaction à un événement. -If you rely on propagation and it's difficult to trace which handlers execute and why, try this approach instead. +Essayez plutôt cette approche si vous vous appuyez sur la propagation d’événements et qu’il est difficile de retracer quels gestionnaires sont exécutés et pourquoi. -### Preventing default behavior {/*preventing-default-behavior*/} +### Empêcher le comportement par défaut {/*preventing-default-behavior*/} -Some browser events have default behavior associated with them. For example, a `
` submit event, which happens when a button inside of it is clicked, will reload the whole page by default: +Certains événements natifs du navigateur ont un comportement par défaut qui leur est associé. Par exemple, lorsqu’un bouton à l’intérieur d’un élément `` est cliqué, l’événement de soumission (`submit`) du formulaire se déclenche et, par défaut, provoque le rechargement complet de la page : ```js export default function Signup() { return ( - alert('Submitting!')}> + alert('Envoi en cours !')}> - + ); } @@ -487,7 +489,7 @@ button { margin-left: 5px; }
-You can call `e.preventDefault()` on the event object to stop this from happening: +Vous pouvez appeler `e.preventDefault()` sur l’objet événement pour empêcher ça : @@ -496,10 +498,10 @@ export default function Signup() { return (
{ e.preventDefault(); - alert('Submitting!'); + alert('Envoi en cours !'); }}> - +
); } @@ -511,28 +513,28 @@ button { margin-left: 5px; }
-Don't confuse `e.stopPropagation()` and `e.preventDefault()`. They are both useful, but are unrelated: +Ne confondez pas `e.stopPropagation()` et `e.preventDefault()`. Ils sont tous les deux utiles, mais ils sont sans rapport : -* [`e.stopPropagation()`](https://developer.mozilla.org/docs/Web/API/Event/stopPropagation) stops the event handlers attached to the tags above from firing. -* [`e.preventDefault()` ](https://developer.mozilla.org/docs/Web/API/Event/preventDefault) prevents the default browser behavior for the few events that have it. +* [`e.stopPropagation()`](https://developer.mozilla.org/docs/Web/API/Event/stopPropagation) est utilisé pour arrêter la propagation de l’événement vers les éléments parents. +* [`e.preventDefault()` ](https://developer.mozilla.org/docs/Web/API/Event/preventDefault) est utilisé pour empêcher le comportement par défaut associé à un événement natif du navigateur. -## Can event handlers have side effects? {/*can-event-handlers-have-side-effects*/} +## Les gestionnaires d’événements peuvent-ils avoir des effets de bord ? {/*can-event-handlers-have-side-effects*/} -Absolutely! Event handlers are the best place for side effects. +Absolument ! Les gestionnaires d’événements sont l’endroit idéal pour les effets de bord. -Unlike rendering functions, event handlers don't need to be [pure](/learn/keeping-components-pure), so it's a great place to *change* something—for example, change an input's value in response to typing, or change a list in response to a button press. However, in order to change some information, you first need some way to store it. In React, this is done by using [state, a component's memory.](/learn/state-a-components-memory) You will learn all about it on the next page. +Contrairement aux fonctions de rendu, les gestionnaires d’événements n’ont pas besoin d’être [purs](/learn/keeping-components-pure). Ce sont donc d'excellents endroits pour *changer* des trucs, par exemple modifier la valeur d’une saisie en réponse à une frappe, ou modifier une liste en réponse à un appui sur un bouton. Ceci dit, pour modifier des informations, vous avez d’abord besoin d’un moyen de les stocker. En React, ça se fait en utilisant [l’état, la mémoire d’un composant](/learn/state-a-components-memory). Vous apprendrez tout ça dans la page suivante. -* You can handle events by passing a function as a prop to an element like ` ); } @@ -569,7 +571,7 @@ export default function LightSwitch() { -The problem is that ` ); } @@ -594,7 +596,7 @@ export default function LightSwitch() { -Alternatively, you could wrap the call into another function, like ` ); } @@ -621,11 +623,11 @@ export default function LightSwitch() { -#### Wire up the events {/*wire-up-the-events*/} +#### Connecter les événements {/*wire-up-the-events*/} -This `ColorSwitch` component renders a button. It's supposed to change the page color. Wire it up to the `onChangeColor` event handler prop it receives from the parent so that clicking the button changes the color. +Ce composant `ColorSwitch` affiche un bouton. Il est censé changer la couleur de la page. Connectez-le à la prop `onChangeColor` de gestionnaire d'événement qu'il reçoit de son composant parent, de sorte que la couleur change losqu'on clique sur le bouton. -After you do this, notice that clicking the button also increments the page click counter. Your colleague who wrote the parent component insists that `onChangeColor` does not increment any counters. What else might be happening? Fix it so that clicking the button *only* changes the color, and does _not_ increment the counter. +Après avoir effectué cette modification, vous remarquerez que le clic du bouton incrémente également le compteur de clics de la page. Votre collègue, qui a écrit le composant parent, vous certifie que `onChangeColor` n’incrémente aucun compteur. Que pourrait-il se passer d’autre ? Corrigez ça afin qu'un clic sur le bouton change uniquement la couleur, mais n’incrémente _pas_ le compteur. @@ -635,7 +637,7 @@ export default function ColorSwitch({ }) { return ( ); } @@ -669,7 +671,7 @@ export default function App() {

-

Clicks on the page: {clicks}

+

Nombre de clics sur la page : {clicks}

); } @@ -679,9 +681,9 @@ export default function App() { -First, you need to add the event handler, like ` ); } @@ -728,7 +730,7 @@ export default function App() {

-

Clicks on the page: {clicks}

+

Nombre de clics sur la page : {clicks}

); }