diff --git a/src/content/learn/responding-to-events.md b/src/content/learn/responding-to-events.md index 4450c4613..83b5439eb 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: Respondendo 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. +O React permite você adicionar *manipuladores de eventos* (event handlers) ao seu JSX. Os manipuladores de eventos são funções independentes que são acionadas em resposta a interações como clicar com o mouse, passar o cursor do mouse sobre um certo elemento, focar em campos de formulário, entre outros. -* 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 maneiras de escrever um manipulador de eventos +* Como herdar a lógica de manipulação de eventos de um componente pai +* Como os eventos se propagam e como pará-los -## Adding event handlers {/*adding-event-handlers*/} +## Adicionando manipuladores 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 adicionar um manipulador de eventos, primeiro defina uma função e depois [passe-a como uma prop](/learn/passing-props-to-a-component) para o elemento JSX desejado. Por exemplo, aqui temos um botão que ainda não faz nada: @@ -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: +Seguindo esses três passos, você poderá fazer com que uma mensagem seja exibida quando um usuário clicar no botão: -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,76 @@ 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 +206,7 @@ function UploadButton() { export default function Toolbar() { return (
- +
); @@ -220,22 +219,22 @@ button { margin-right: 10px; } -Here, the `Toolbar` component renders a `PlayButton` and an `UploadButton`: +Aqui, o componente `Toolbar` renderiza o componente `PlayButton` e o componente`UploadButton`: -- `PlayButton` passes `handlePlayClick` as the `onClick` prop to the `Button` inside. -- `UploadButton` passes `() => alert('Uploading!')` as the `onClick` prop to the `Button` inside. +- O `PlayButton` passa o `handlePlayClick` como prop `onClick` para o `Button` dentro dele. +- O `UploadButton` passa `() => alert('Enviando!')` como a prop `onClick` para o `Button` dentro. -Finally, your `Button` component accepts a prop called `onClick`. It passes that prop directly to the built-in browser ` - ); @@ -268,9 +267,9 @@ button { margin-right: 10px; } -In this example, ` ); @@ -312,19 +311,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. - +Note como o componente `App` não precisa saber *o que* o componente `Toolbar` fará com o `onPlayMovie` ou `onUploadImage`. Isso é um detalhe de implementação da `Toolbar`. Aqui, a `Toolbar` os passa como manipuladores `onClick` para seus componentes `Button`, mas posteriormente pode acioná-los também em um atalho de teclado. Nomear as props com base em interações específicas da aplicação, como `onPlayMovie`, oferece a flexibilidade para alterar como elas são usadas no futuro. + -Make sure that you use the appropriate HTML tags for your event handlers. For example, to handle clicks, use [` - ); @@ -355,19 +354,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. +Se você clicar em qualquer um dos botões, o `onClick` do botão clicado será executado primeiro e, em seguida, o `onClick` da `
` pai será executado. Como resultado, duas mensagens serão exibidas. Se você clicar na toolbar, apenas o `onClick` da `
` pai será executado. -All events propagate in React except `onScroll`, which only works on the JSX tag you attach it to. +Todos os eventos se propagam no React, exceto `onScroll`, que funciona apenas na tag JSX à qual foi adicionado. -### Stopping propagation {/*stopping-propagation*/} +### Interrompendo a propagação {/*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. +Os manipuladores de eventos recebem um **event object** como único argumento. Por convenção, ele é normalmente chamado de `e`, que significa "event", em inglês. Você pode usar esse objeto para obter informações sobre o 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: +Esse event object também permite que você interrompa a propagação. Caso deseje que um evento não chegue aos componentes pai, você precisa chamar `e.stopPropagation()` como no exemplo do componente `Button` abaixo: @@ -386,13 +385,13 @@ function Button({ onClick, children }) { export default function Toolbar() { return (
{ - alert('You clicked on the toolbar!'); + alert('Você clicou na toolbar!'); }}> - -
); @@ -409,43 +408,43 @@ button { margin: 5px; }
-When you click on a button: +Ao clicar em um dos botões: -1. React calls the `onClick` handler passed to `
``` -Each event propagates in three phases: +Cada evento se propaga em três 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. Ele se propaga para baixo, chamando todos os manipuladores `onClickCapture`. +2. Ele executa o manipulador `onClick` do elemento clicado. +3. Ele se propaga para cima, chamando todos os manipuladores `onClick`. -Capture events are useful for code like routers or analytics, but you probably won't use them in app code. +Os eventos de captura são úteis para códigos como roteadores ou análises, mas você provavelmente não os usará no código de uma aplicação. -### Passing handlers as alternative to propagation {/*passing-handlers-as-alternative-to-propagation*/} +### Passando manipuladores como alternativa à propagação {/*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: +Observe como esse manipulador de cliques executa uma linha de código _e depois_ chama a prop `onClick` passada pelo pai: ```js {4,5} function Button({ onClick, children }) { @@ -460,22 +459,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. +Você também pode adicionar mais código a esse manipulador antes de chamar o manipulador de eventos `onClick` do elemento pai. Esse padrão fornece uma *alternativa* à propagação. Ele permite que o componente filho manipule o evento, mas ainda permitindo que o componente pai especifique algum comportamento adicional. Diferente da propagação, esse padrão não é automático, mas a sua vantagem é que você pode seguir claramente toda a cadeia de código executada como resultado de algum evento. -If you rely on propagation and it's difficult to trace which handlers execute and why, try this approach instead. +Caso você esteja dependendo da propagação de eventos e tenha dificuldade em rastrear quais manipuladores estão sendo executados e por quê, tente essa abordagem. -### Preventing default behavior {/*preventing-default-behavior*/} +### Removendo comportamento padrão {/*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: +Alguns eventos do navegador têm um comportamento padrão associado a eles. Por exemplo, um evento de envio de formulário ``, que acontece quando um botão dentro dele é clicado, recarregará a página inteira por padrão: ```js export default function Signup() { return ( - alert('Submitting!')}> + alert('Enviando!')}> - + ); } @@ -487,7 +486,7 @@ button { margin-left: 5px; }
-You can call `e.preventDefault()` on the event object to stop this from happening: +É possível chamar `e.preventDefault()` no objeto do evento para impedir que isso aconteça: @@ -496,10 +495,10 @@ export default function Signup() { return (
{ e.preventDefault(); - alert('Submitting!'); + alert('Enviando!'); }}> - +
); } @@ -511,28 +510,28 @@ button { margin-left: 5px; }
-Don't confuse `e.stopPropagation()` and `e.preventDefault()`. They are both useful, but are unrelated: +Não confunda `e.stopPropagation()` com `e.preventDefault()`. Ambos são úteis, mas não estão 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/pt-BR/docs/Web/API/Event/stopPropagation) impede que os manipuladores de eventos associados às tags superiores sejam acionados. +* [`e.preventDefault()` ](https://developer.mozilla.org/pt-BR/docs/Web/API/Event/preventDefault) impede que o navegador execute o comportamento padrão associado a determinados eventos. -## Can event handlers have side effects? {/*can-event-handlers-have-side-effects*/} +## Os manipuladores de eventos podem ter efeitos colaterais? {/*can-event-handlers-have-side-effects*/} -Absolutely! Event handlers are the best place for side effects. +Sem dúvida! Os manipuladores de eventos são o local ideal para efeitos colaterais. -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. +Ao contrário das funções de renderização, os manipuladores de eventos não precisam ser [puros](/learn/keeping-components-pure), o que significa que é o local ideal para realizar *modificações*, por exemplo, alterar o valor de um input em resposta à digitação, ou alterar uma lista em resposta ao clique de um botão. No entanto, para alterar alguma informação, você primeiro precisa de uma maneira de armazenar essa informação. No React, isso é feito usando o [state, a memória de um componente.](/learn/state-a-components-memory) Você aprenderá tudo sobre isso na próxima página. -* You can handle events by passing a function as a prop to an element like ` ); } @@ -569,7 +568,7 @@ export default function LightSwitch() { -The problem is that ` ); } @@ -594,7 +593,7 @@ export default function LightSwitch() { -Alternatively, you could wrap the call into another function, like ` ); } @@ -621,11 +620,11 @@ export default function LightSwitch() { -#### Wire up the events {/*wire-up-the-events*/} +#### Conecte os 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 um botão que deveria alterar a cor da página. Conecte-o ao manipulador de eventos `onChangeColor` que ele recebe do pai. Assim, ao clicar no botão, a cor da página será alterada. -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. +Depois de fazer isso, perceba que ao clicar no botão, o contador de cliques da página também é incrementado. Seu colega, que escreveu o componente pai, insiste que o `onChangeColor` não deveria incrementar o contador. O que mais poderia estar acontecendo? Corrija o problema para que ao clicar no botão, *apenas* altere a cor e _não_ incremente o contador. @@ -635,7 +634,7 @@ export default function ColorSwitch({ }) { return ( ); } @@ -669,7 +668,7 @@ export default function App() {

-

Clicks on the page: {clicks}

+

Cliques na página: {clicks}

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