diff --git a/beta/src/content/learn/responding-to-events.md b/beta/src/content/learn/responding-to-events.md index fd7cda47a..aeafcb975 100644 --- a/beta/src/content/learn/responding-to-events.md +++ b/beta/src/content/learn/responding-to-events.md @@ -1,24 +1,24 @@ --- -title: Responding to Events +title: Responder a Eventos --- -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 te permite añadir *manejadores de eventos* a tu JSX. Los manejadores de eventos son tus propias funciones que se ejecutarán en respuesta a interacciones como hacer clic, _hover_, enfocar _inputs_ en formularios, entre otras. -* 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 +* Diferentes maneras de escribir un manejador de eventos +* Cómo pasar la lógica de manejo de eventos desde un componente padre +* Cómo los eventos se propagan y cómo detenerlos -## Adding event handlers {/*adding-event-handlers*/} +## Añadiendo manejadores de eventos {/*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: +Para agregar un manejador de eventos, primero definirás una función y luego [la pasarás como una prop](/learn/passing-props-to-a-component) a la etiqueta JSX apropiada. Por ejemplo, este es un botón que no hace nada todavía: @@ -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: +Puedes hacer que muestre un mensaje cuando un usuario haga clic siguiendo estos tres pasos: -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,77 @@ 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 ( - ); } @@ -220,22 +220,22 @@ button { margin-right: 10px; } -Here, the `Toolbar` component renders a `PlayButton` and an `UploadButton`: +Aquí, el componente `Toolbar` renderiza un `PlayButton` y 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. +- `PlayButton` pasa `handlePlayClick` como la prop `onClick` al `Button` que está dentro. +- `UploadButton` pasa `() => alert('Uploading!')` como la prop `onClick` al `Button` que está dentro. -Finally, your `Button` component accepts a prop called `onClick`. It passes that prop directly to the built-in browser ` - ); @@ -268,9 +268,9 @@ button { margin-right: 10px; } -In this example, ` ); @@ -312,13 +312,13 @@ 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. +Fíjate como el componente `App` no necesita saber *qué* hará `Toolbar` con `onPlayMovie` o `onUploadImage`. Eso es un detalle de implementación del `Toolbar`. Aquí, `Toolbar` los pasa como manejadores `onClick` en sus `Button`s, pero podría luego iniciarlos con un atajo de teclado. Nombrar props a partir de interacciones específicas de la aplicación como `onPlayMovie` te da la flexibilidad de cambiar cómo se usan más tarde. -## Event propagation {/*event-propagation*/} +## Propagación de eventos {/*event-propagation*/} -Event handlers will also catch events from any children your component might have. We say that an event "bubbles" or "propagates" up the tree: it starts with where the event happened, and then goes up the tree. +Los manejadores de eventos también atraparán eventos de cualquier componente hijo que tu componente pueda tener. Decimos que un evento "se expande" o "se propaga" hacia arriba en el árbol de componentes cuando: empieza donde el evento sucedió, y luego sube en el árbol. -This `
` contains two buttons. Both the `
` *and* each button have their own `onClick` handlers. Which handlers do you think will fire when you click a button? +Este `
` contiene dos botones. Tanto el `
` *como* cada botón tienen sus propios manejadores `onClick`. ¿Qué manejador crees que se activará cuando hagas clic en un botón? @@ -326,13 +326,13 @@ This `
` contains two buttons. Both the `
` *and* each button have their export default function Toolbar() { return (
{ - alert('You clicked on the toolbar!'); + alert('¡Cliqueaste el Toolbar!'); }}> - -
); @@ -349,19 +349,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 haces clic en cualquiera de los botones, su `onClick` se ejecutará primero, seguido por el `onClick` del `
`. Así que dos mensajes aparecerán. Si haces clic en el propio toolbar, solo el `onClick` del `
` padre se ejecutará. -All events propagate in React except `onScroll`, which only works on the JSX tag you attach it to. +Todos los eventos se propagan en React excepto `onScroll`, el cual solo funciona en la etiqueta JSX a la que lo agregues. -### Stopping propagation {/*stopping-propagation*/} +### Detener la propagación {/*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. +Los manejadores de eventos reciben un **objeto del evento** como su único parámetro. Por convención, normalmente es llamado `e`, que quiere decir "evento". Puedes usar este objeto para leer información del evento. -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: +Ese objeto del evento también te permite detener la propagación. Si quieres evitar que un evento llegue a los componentes padre, necesitas llamar `e.stopPropagation()` como este componente `Button` lo hace: @@ -380,13 +380,13 @@ function Button({ onClick, children }) { export default function Toolbar() { return (
{ - alert('You clicked on the toolbar!'); + alert('¡Cliqueaste el Toolbar!'); }}> - -
); @@ -403,41 +403,41 @@ button { margin: 5px; }
-When you click on a button: +Cuando haces clic en un botón: -1. React calls the `onClick` handler passed to `
``` -Each event propagates in three phases: +Cada evento se propaga en tres fases: -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. Viaja hacia abajo, llamando a todos los manejadores `onClickCapture`. +2. Ejecuta el manejador `onClick` del elemento pulsado. +3. Viaja hacia arriba, llamando a todos los manejadores `onClick`. -Capture events are useful for code like routers or analytics, but you probably won't use them in app code. +Los eventos de captura son útiles para código como enrutadores o para analítica, pero probablemente no lo usarás en código de aplicaciones. -### Passing handlers as alternative to propagation {/*passing-handlers-as-alternative-to-propagation*/} +### Pasar manejadores como alternativa a la propagación {/*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: +Fíjate como este manejador de clic ejecuta una línea de código _y luego_ llama a la prop `onClick` pasada por el padre: ```js {4,5} function Button({ onClick, children }) { @@ -452,20 +452,20 @@ 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 code that executes as a result of some event. +También puede que añadas más código a este manejador antes de llamar al manejador de eventos `onClick` del padre. Este patrón proporciona una *alternativa* a la propagación. Le permite al componente hijo manejar el evento, mientras también le permite al componente padre especificar algún comportamiento adicional. A diferencia de la propagación, no es automático. Pero el beneficio de este patrón es que puedes seguir claramente la cadena de código completa que se ejecuta como resultado de algún evento. -If you rely on propagation and it's difficult to trace which handlers execute and why, try this approach instead. +Si dependes de la propagación y es difícil rastrear cuales manejadores se ejecutaron y por qué, intenta este enfoque. -### Preventing default behavior {/*preventing-default-behavior*/} +### Evitar el comportamiento por defecto {/*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: +Algunos eventos del navegador tienen comportamientos por defecto asociados a ellos. Por ejemplo, un evento submit de un ``, que ocurre cuando se pulsa un botón que está dentro de él, por defecto recargará la página completa: ```js export default function Signup() { return ( - alert('Submitting!')}> + alert('¡Enviando!')}> @@ -479,7 +479,7 @@ button { margin-left: 5px; }
-You can call `e.preventDefault()` on the event object to stop this from happening: +Puedes llamar `e.preventDefault()` en el objeto del evento para evitar que esto suceda: @@ -488,10 +488,10 @@ export default function Signup() { return (
{ e.preventDefault(); - alert('Submitting!'); + alert('¡Enviando!'); }}> - +
); } @@ -503,28 +503,28 @@ button { margin-left: 5px; }
-Don't confuse `e.stopPropagation()` and `e.preventDefault()`. They are both useful, but are unrelated: +No confundas `e.stopPropagation()` y `e.preventDefault()`. Ambos son útiles, pero no están relacionados: -* [`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/es/docs/Web/API/Event/stopPropagation) evita que los manejadores de eventos adjuntos a etiquetas de nivel superior se activen. +* [`e.preventDefault()` ](https://developer.mozilla.org/es/docs/Web/API/Event/preventDefault) evita el comportamiento por defecto del navegador para algunos eventos que lo tienen. -## Can event handlers have side effects? {/*can-event-handlers-have-side-effects*/} +## ¿Pueden los manejadores de eventos tener efectos secundarios? {/*can-event-handlers-have-side-effects*/} -Absolutely! Event handlers are the best place for side effects. +¡Absolutamente! Los manejadores de eventos son el mejor lugar para los efectos secundarios. -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. +A diferencia de las funciones de renderizado, los manejadores de eventos no necesitan ser [puros](/learn/keeping-components-pure), asi que es un buen lugar para *cambiar* algo; por ejemplo, cambiar el valor de un input en respuesta a la escritura, o cambiar una lista en respuesta a un botón presionado. Sin embargo, para cambiar una información, primero necesitas alguna manera de almacenarla. En React, esto se hace usando el [estado, la memoria de un componente.](/learn/state-a-components-memory) Aprenderás todo sobre ello en la siguiente página. -* You can handle events by passing a function as a prop to an element like ` ); } @@ -561,7 +561,7 @@ export default function LightSwitch() { -The problem is that ` ); } @@ -586,7 +586,7 @@ export default function LightSwitch() { -Alternatively, you could wrap the call into another function, like ` ); } @@ -613,11 +613,11 @@ export default function LightSwitch() { -#### Wire up the events {/*wire-up-the-events*/} +#### Conecta los eventos {/*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. +Este componente `ColorSwitch` renderiza un botón. Se supone que debe cambiar el color de la página. Conéctalo a la prop manejadora de eventos `onChangeColor` que recibe del padre de modo que al pulsar el botón cambie el color. -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. +Después que hagas esto, fíjate que al pulsar el botón también incrementa el contador de clics de la página. Tu colega que escribió el componente padre insiste que `onChangeColor` no incrementa ningún contador. ¿Qué más podría estar pasando? Soluciónalo de manera que el botón *sólo* cambie el color, y _no_ incremente el contador. @@ -627,7 +627,7 @@ export default function ColorSwitch({ }) { return ( ); } @@ -661,7 +661,7 @@ export default function App() {

-

Clicks on the page: {clicks}

+

Clics en la página: {clicks}

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

-

Clicks on the page: {clicks}

+

Clics en la página: {clicks}

); }