diff --git a/src/content/learn/synchronizing-with-effects.md b/src/content/learn/synchronizing-with-effects.md index 9ca109656..419f6a08d 100644 --- a/src/content/learn/synchronizing-with-effects.md +++ b/src/content/learn/synchronizing-with-effects.md @@ -1,97 +1,96 @@ --- -title: 'Synchronizing with Effects' +title: 'Sincronizando com Efeitos' --- -Some components need to synchronize with external systems. For example, you might want to control a non-React component based on the React state, set up a server connection, or send an analytics log when a component appears on the screen. *Effects* let you run some code after rendering so that you can synchronize your component with some system outside of React. +Alguns componentes precisam se sincronizar com sistemas externos. Por exemplo, você pode querer controlar um componente que não é do React com base no estado do React, configurar uma conexão com o servidor ou enviar um log de análise quando um componente aparecer na tela. *Efeitos* permitem que você execute algum código após a renderização para que você possa sincronizar seu componente com algum sistema fora do React. -- What Effects are -- How Effects are different from events -- How to declare an Effect in your component -- How to skip re-running an Effect unnecessarily -- Why Effects run twice in development and how to fix them +- O que são Efeitos +- Como os Efeitos diferem de eventos +- Como declarar um Efeito em seu componente +- Como evitar a reexecução desnecessária de um Efeito +- Por que os Efeitos são executados duas vezes em desenvolvimento e como corrigir isso -## What are Effects and how are they different from events? {/*what-are-effects-and-how-are-they-different-from-events*/} +## O que são Efeitos e como eles diferem de eventos? {/*what-are-effects-and-how-are-they-different-from-events*/} -Before getting to Effects, you need to be familiar with two types of logic inside React components: +Antes de abordar os Efeitos, você precisa estar familiarizado com dois tipos de lógica dentro dos componentes do React: -- **Rendering code** (introduced in [Describing the UI](/learn/describing-the-ui)) lives at the top level of your component. This is where you take the props and state, transform them, and return the JSX you want to see on the screen. [Rendering code must be pure.](/learn/keeping-components-pure) Like a math formula, it should only _calculate_ the result, but not do anything else. +- **Código de renderização** (introduzido em [Descrevendo a UI](/learn/describing-the-ui)) vive no nível superior do seu componente. É aqui que você pega as props e o estado, os transforma e retorna o JSX que você quer ver na tela. [O código de renderização deve ser puro.](/learn/keeping-components-pure) Como uma fórmula matemática, ele deve apenas _calcular_ o resultado, mas não fazer nada mais. -- **Event handlers** (introduced in [Adding Interactivity](/learn/adding-interactivity)) are nested functions inside your components that *do* things rather than just calculate them. An event handler might update an input field, submit an HTTP POST request to buy a product, or navigate the user to another screen. Event handlers contain ["side effects"](https://en.wikipedia.org/wiki/Side_effect_(computer_science)) (they change the program's state) caused by a specific user action (for example, a button click or typing). +- **Manipuladores de eventos** (introduzidos em [Adicionando Interatividade](/learn/adding-interactivity)) são funções aninhadas dentro dos seus componentes que *fazem* coisas em vez de apenas calculá-las. Um manipulador de eventos pode atualizar um campo de entrada, enviar uma solicitação HTTP POST para comprar um produto ou navegar o usuário para outra tela. Manipuladores de eventos contêm ["efeitos colaterais"](https://en.wikipedia.org/wiki/Side_effect_(computer_science)) (eles mudam o estado do programa) causados por uma ação específica do usuário (por exemplo, um clique de botão ou digitação). -Sometimes this isn't enough. Consider a `ChatRoom` component that must connect to the chat server whenever it's visible on the screen. Connecting to a server is not a pure calculation (it's a side effect) so it can't happen during rendering. However, there is no single particular event like a click that causes `ChatRoom` to be displayed. +Às vezes, isso não é suficiente. Considere um componente `ChatRoom` que deve se conectar ao servidor de chat sempre que estiver visível na tela. Conectar-se a um servidor não é um cálculo puro (é um efeito colateral), então não pode acontecer durante a renderização. No entanto, não há um evento particular como um clique que cause a exibição do `ChatRoom`. -***Effects* let you specify side effects that are caused by rendering itself, rather than by a particular event.** Sending a message in the chat is an *event* because it is directly caused by the user clicking a specific button. However, setting up a server connection is an *Effect* because it should happen no matter which interaction caused the component to appear. Effects run at the end of a [commit](/learn/render-and-commit) after the screen updates. This is a good time to synchronize the React components with some external system (like network or a third-party library). +***Efeitos* permitem que você especifique efeitos colaterais que são causados pela própria renderização, em vez de por um evento particular.** Enviar uma mensagem no chat é um *evento* porque é causado diretamente pelo usuário ao clicar em um botão específico. No entanto, configurar uma conexão com o servidor é um *Efeito* porque deve acontecer não importando qual interação causou o aparecimento do componente. Efeitos são executados no final de um [compromisso](/learn/render-and-commit) após a atualização da tela. Este é um bom momento para sincronizar os componentes do React com algum sistema externo (como uma rede ou uma biblioteca de terceiros). -Here and later in this text, capitalized "Effect" refers to the React-specific definition above, i.e. a side effect caused by rendering. To refer to the broader programming concept, we'll say "side effect". +Aqui e mais adiante neste texto, "Efeito" com letra maiúscula refere-se à definição específica do React acima, ou seja, um efeito colateral causado pela renderização. Para referir-se ao conceito de programação mais amplo, diremos "efeito colateral". +## Você pode não precisar de um Efeito {/*you-might-not-need-an-effect*/} -## You might not need an Effect {/*you-might-not-need-an-effect*/} +**Não se apresse para adicionar Efeitos aos seus componentes.** Lembre-se de que os Efeitos são normalmente usados para "sair" do seu código React e se sincronizar com algum sistema *externo*. Isso inclui APIs do navegador, widgets de terceiros, rede, e assim por diante. Se o seu Efeito apenas ajusta algum estado com base em outro estado, [você pode não precisar de um Efeito.](/learn/you-might-not-need-an-effect) -**Don't rush to add Effects to your components.** Keep in mind that Effects are typically used to "step out" of your React code and synchronize with some *external* system. This includes browser APIs, third-party widgets, network, and so on. If your Effect only adjusts some state based on other state, [you might not need an Effect.](/learn/you-might-not-need-an-effect) +## Como escrever um Efeito {/*how-to-write-an-effect*/} -## How to write an Effect {/*how-to-write-an-effect*/} +Para escrever um Efeito, siga estas três etapas: -To write an Effect, follow these three steps: +1. **Declare um Efeito.** Por padrão, seu Efeito será executado após cada [compromisso](/learn/render-and-commit). +2. **Especifique as dependências do Efeito.** A maioria dos Efeitos deve apenas ser reexecutada *quando necessário* em vez de após cada renderização. Por exemplo, uma animação de aparecimento deve apenas ser acionada quando um componente aparecer. Conectar-se e desconectar-se de uma sala de chat deve acontecer apenas quando o componente aparecer e desaparecer, ou quando a sala de chat mudar. Você aprenderá a controlar isso especificando *dependências*. +3. **Adicione limpeza se necessário.** Alguns Efeitos precisam especificar como parar, desfazer ou limpar o que estavam fazendo. Por exemplo, "conectar" precisa de "desconectar", "inscrever" precisa de "cancelar inscrição", e "buscar" precisa de "cancelar" ou "ignorar". Você aprenderá a fazer isso retornando uma *função de limpeza*. -1. **Declare an Effect.** By default, your Effect will run after every [commit](/learn/render-and-commit). -2. **Specify the Effect dependencies.** Most Effects should only re-run *when needed* rather than after every render. For example, a fade-in animation should only trigger when a component appears. Connecting and disconnecting to a chat room should only happen when the component appears and disappears, or when the chat room changes. You will learn how to control this by specifying *dependencies.* -3. **Add cleanup if needed.** Some Effects need to specify how to stop, undo, or clean up whatever they were doing. For example, "connect" needs "disconnect", "subscribe" needs "unsubscribe", and "fetch" needs either "cancel" or "ignore". You will learn how to do this by returning a *cleanup function*. +Vamos olhar para cada uma dessas etapas em detalhes. -Let's look at each of these steps in detail. +### Etapa 1: Declare um Efeito {/*step-1-declare-an-effect*/} -### Step 1: Declare an Effect {/*step-1-declare-an-effect*/} - -To declare an Effect in your component, import the [`useEffect` Hook](/reference/react/useEffect) from React: +Para declarar um Efeito em seu componente, importe o [`useEffect` Hook](/reference/react/useEffect) do React: ```js import { useEffect } from 'react'; ``` -Then, call it at the top level of your component and put some code inside your Effect: +Em seguida, chame-o no nível superior do seu componente e coloque algum código dentro do seu Efeito: ```js {2-4} function MyComponent() { useEffect(() => { - // Code here will run after *every* render + // O código aqui será executado após *cada* renderização }); return
; } ``` -Every time your component renders, React will update the screen *and then* run the code inside `useEffect`. In other words, **`useEffect` "delays" a piece of code from running until that render is reflected on the screen.** +Toda vez que seu componente renderizar, o React atualizará a tela *e então* executará o código dentro de `useEffect`. Em outras palavras, **`useEffect` "atrasará" um trecho de código de ser executado até que aquela renderização seja refletida na tela.** -Let's see how you can use an Effect to synchronize with an external system. Consider a `` React component. It would be nice to control whether it's playing or paused by passing an `isPlaying` prop to it: +Vamos ver como você pode usar um Efeito para se sincronizar com um sistema externo. Considere um componente React ``. Seria bom controlar se está tocando ou pausado passando uma prop `isPlaying` para ele: ```js ; ``` -Your custom `VideoPlayer` component renders the built-in browser [`