Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Translate forwardRef #773

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 52 additions & 53 deletions src/content/reference/react/forwardRef.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ title: forwardRef

<Intro>

`forwardRef` lets your component expose a DOM node to parent component with a [ref.](/learn/manipulating-the-dom-with-refs)
`forwardRef` Permitira que seu componente exponha um nó DOM para o componente pai com um [ref.](/learn/manipulating-the-dom-with-refs)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

permitira

estando no futuro do pretérito do indicativo faz referencia a uma ação tomada no passado, mas o resto da documentação usa o presente do indicativo, ex: "retorna".

Então acho que o mais correto aqui seria "Permite que seu componente..."


```js
const SomeComponent = forwardRef(render)
Expand All @@ -16,11 +16,11 @@ const SomeComponent = forwardRef(render)

---

## Reference {/*reference*/}
## Referência {/*reference*/}

### `forwardRef(render)` {/*forwardref*/}

Call `forwardRef()` to let your component receive a ref and forward it to a child component:
Invoque `forwardRef()` para criar um componente que pode receber um `ref` e repassá-lo para um componente filho:

```js
import { forwardRef } from 'react';
Expand All @@ -30,27 +30,26 @@ const MyInput = forwardRef(function MyInput(props, ref) {
});
```

[See more examples below.](#usage)
[Veja mais exemplos abaixo.](#usage)

#### Parameters {/*parameters*/}
#### Parâmetros {/*parameters*/}

* `render`: The render function for your component. React calls this function with the props and `ref` that your component received from its parent. The JSX you return will be the output of your component.
* `render`: A função de renderização do seu componente. O React usa essa função com as props e o `ref` que seu componente recebeu do pai. O JSX que irá retornar será o resultado do seu componente.

#### Returns {/*returns*/}
#### Retornos {/*returns*/}

`forwardRef` returns a React component that you can render in JSX. Unlike React components defined as plain functions, a component returned by `forwardRef` is also able to receive a `ref` prop.
`forwardRef` retorna um componente React que você pode renderizar em JSX. Diferente dos componentes React definidos como funções simples, um componente retornado por `forwardRef` também pode receber uma prop `ref`.

#### Caveats {/*caveats*/}
#### Advertências {/*caveats*/}

* In Strict Mode, React will **call your render function twice** in order to [help you find accidental impurities.](/reference/react/useState#my-initializer-or-updater-function-runs-twice) This is development-only behavior and does not affect production. If your render function is pure (as it should be), this should not affect the logic of your component. The result from one of the calls will be ignored.
* No Modo Estrito, o React **chamará sua função de renderização duas vezes** para [ajudar a encontrar impurezas acidentais.](/reference/react/useState#my-initializer-or-updater-function-runs-twice) Esse comportamento ocorre apenas no ambiente de desenvolvimento e não afeta a produção. Se sua função de renderização for pura (como deve ser), isso não afetará a lógica do seu componente. O resultado de uma das chamadas será ignorado.


---

### `render` function {/*render-function*/}

`forwardRef` accepts a render function as an argument. React calls this function with `props` and `ref`:
### Função de `renderização` {/*render-function*/}

`forwardRef` aceita uma função de renderização como argumento. O React chama essa função com as props e o ref:
```js
const MyInput = forwardRef(function MyInput(props, ref) {
return (
Expand All @@ -64,21 +63,22 @@ const MyInput = forwardRef(function MyInput(props, ref) {

#### Parameters {/*render-parameters*/}

* `props`: The props passed by the parent component.
* `props`: As props passadas pelo componente pai.

* `ref`: The `ref` attribute passed by the parent component. The `ref` can be an object or a function. If the parent component has not passed a ref, it will be `null`. You should either pass the `ref` you receive to another component, or pass it to [`useImperativeHandle`.](/reference/react/useImperativeHandle)
* `ref`: O atributo `ref` transmitido pelo componente pai. O `ref` pode ser um objeto ou uma função. Se o componente pai não passar um `ref`, ele será `null`. Você deve passar o `ref` recebido para outro componente ou usá-lo com [useImperativeHandle.le`.](/reference/react/useImperativeHandle)

#### Returns {/*render-returns*/}
#### Retornos {/*render-returns*/}

`forwardRef` returns a React component that you can render in JSX. Unlike React components defined as plain functions, the component returned by `forwardRef` is able to take a `ref` prop.
`forwardRef` retorna um componente React que você pode renderizar em JSX. Diferente dos componentes React definidos como funções simples, um componente retornado por `forwardRef` também pode receber uma prop `ref`.

---

## Usage {/*usage*/}
## Uso {/*usage*/}

### Exposing a DOM node to the parent component {/*exposing-a-dom-node-to-the-parent-component*/}
### Expondo um nó DOM ao componente pai {/*exposing-a-dom-node-to-the-parent-component*/}

By default, each component's DOM nodes are private. However, sometimes it's useful to expose a DOM node to the parent--for example, to allow focusing it. To opt in, wrap your component definition into `forwardRef()`:
Por padrão, os nós DOM de cada componente são privados. No entanto, às vees é útil expor um nó DOM ao componente pai — por exemplo, para permitir que ele seja focado. Para optar
por participar, envolva sua definição de componente em `forwardRef()`:

```js {3,11}
import { forwardRef } from 'react';
Expand All @@ -93,8 +93,7 @@ const MyInput = forwardRef(function MyInput(props, ref) {
);
});
```

You will receive a <CodeStep step={1}>ref</CodeStep> as the second argument after props. Pass it to the DOM node that you want to expose:
Você receberá um <CodeStep step={1}>ref</CodeStep> como segundo argumento após as props. Passe-o para o nó DOM que você deseja expor:

```js {8} [[1, 3, "ref"], [1, 8, "ref", 30]]
import { forwardRef } from 'react';
Expand All @@ -109,8 +108,7 @@ const MyInput = forwardRef(function MyInput(props, ref) {
);
});
```

This lets the parent `Form` component access the <CodeStep step={2}>`<input>` DOM node</CodeStep> exposed by `MyInput`:
Isso vai permitir que o componente pai `Form` acesse o <CodeStep step={2}>`<input>` DOM node</CodeStep> exposto por `MyInput`:

```js [[1, 2, "ref"], [1, 10, "ref", 41], [2, 5, "ref.current"]]
function Form() {
Expand All @@ -131,15 +129,16 @@ function Form() {
}
```

This `Form` component [passes a ref](/reference/react/useRef#manipulating-the-dom-with-a-ref) to `MyInput`. The `MyInput` component *forwards* that ref to the `<input>` browser tag. As a result, the `Form` component can access that `<input>` DOM node and call [`focus()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus) on it.
Este componente `Form` [passa uma ref](/reference/react/useRef#manipulating-the-dom-with-a-ref) para `MyInput`. O componente `MyInput` encaminha essa `ref` para a tag `<input>` do navegador. Como resultado, o componente Form pode acessar esse nó DOM `<input>` e chamar [`focus()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus) nele.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Este componente `Form` [passa uma ref](/reference/react/useRef#manipulating-the-dom-with-a-ref) para `MyInput`. O componente `MyInput` encaminha essa `ref` para a tag `<input>` do navegador. Como resultado, o componente Form pode acessar esse nó DOM `<input>` e chamar [`focus()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus) nele.
Este componente `Form` [passa uma ref](/reference/react/useRef#manipulating-the-dom-with-a-ref) para `MyInput`. O componente `MyInput` encaminha essa `ref` para a tag `<input>` do navegador. Como resultado, o componente Form pode acessar esse nó DOM `<input>` e chamar [`focus()`](https://developer.mozilla.org/pt-BR/docs/Web/API/HTMLElement/focus) nele.


Tenha em mente que expor uma referência ao nó DOM dentro do seu componente torna mais difícil alterar os internos do seu componente mais tarde. Você normalmente exporá nós DOM de componentes reutilizáveis de baixo nível, como botões ou entradas de texto, mas não fará isso para componentes de nível de aplicativo, como um avatar ou um comentário.

Keep in mind that exposing a ref to the DOM node inside your component makes it harder to change your component's internals later. You will typically expose DOM nodes from reusable low-level components like buttons or text inputs, but you won't do it for application-level components like an avatar or a comment.
<Recipes titleText="Exemplos de encaminhamento de um ref">

<Recipes titleText="Examples of forwarding a ref">

#### Focusing a text input {/*focusing-a-text-input*/}
#### Focando uma entrada de texto {/*focusing-a-text-input*/}

Clicking the button will focus the input. The `Form` component defines a ref and passes it to the `MyInput` component. The `MyInput` component forwards that ref to the browser `<input>`. This lets the `Form` component focus the `<input>`.
Clicar no botão focará o `input`. O componente `Form` define uma ref e o passa para o componente `MyInput`. O componente `MyInput` encaminha esse ref para o navegador `<input>`. Isso permite que o componente `Form` foque no `<input>`.

<Sandpack>

Expand Down Expand Up @@ -191,9 +190,9 @@ input {

<Solution />

#### Playing and pausing a video {/*playing-and-pausing-a-video*/}
#### Reproduzir e pausar um vídeo {/*playing-and-pausing-a-video*/}

Clicking the button will call [`play()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play) and [`pause()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/pause) on a `<video>` DOM node. The `App` component defines a ref and passes it to the `MyVideoPlayer` component. The `MyVideoPlayer` component forwards that ref to the browser `<video>` node. This lets the `App` component play and pause the `<video>`.
Clicar no botão chamará [`play()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play) e [`pause()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/pause) em um nó DOM `<video>`. O componente `App` define uma referência e a passa para o componente `MyVideoPlayer`. O componente `MyVideoPlayer` encaminha essa referência para o nó `<video>` do navegador. Isso permite que o componente `App` reproduza e pause o `<video>`.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Clicar no botão chamará [`play()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/play) e [`pause()`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/pause) em um nó DOM `<video>`. O componente `App` define uma referência e a passa para o componente `MyVideoPlayer`. O componente `MyVideoPlayer` encaminha essa referência para o nó `<video>` do navegador. Isso permite que o componente `App` reproduza e pause o `<video>`.
Clicar no botão chamará [`play()`](https://developer.mozilla.org/pt-BR/docs/Web/API/HTMLMediaElement/play) e [`pause()`](https://developer.mozilla.org/pt-BR/docs/Web/API/HTMLMediaElement/pause) em um nó DOM `<video>`. O componente `App` define uma referência e a passa para o componente `MyVideoPlayer`. O componente `MyVideoPlayer` encaminha essa referência para o nó `<video>` do navegador. Isso permite que o componente `App` reproduza e pause o `<video>`.


<Sandpack>

Expand Down Expand Up @@ -252,9 +251,9 @@ button { margin-bottom: 10px; margin-right: 10px; }

---

### Forwarding a ref through multiple components {/*forwarding-a-ref-through-multiple-components*/}
### Encaminhando uma ref através de vários componentes {/*forwarding-a-ref-through-multiple-components*/}

Instead of forwarding a `ref` to a DOM node, you can forward it to your own component like `MyInput`:
Em vez de encaminhar um `ref` para um nó DOM, você pode encaminhá-lo para seu próprio componente, como `MyInput`:

```js {1,5}
const FormField = forwardRef(function FormField(props, ref) {
Expand All @@ -268,7 +267,7 @@ const FormField = forwardRef(function FormField(props, ref) {
});
```

If that `MyInput` component forwards a ref to its `<input>`, a ref to `FormField` will give you that `<input>`:
Se o componente `MyInput` encaminhar uma referência para seu `<input>`, uma referência para `FormField` fornecerá esse `<input>`:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No glossário, 'ref' é uma das palavras que não deve ser traduzida, acredita que devemos manter a tradução nesse caso?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

abaixo, na linha 291, temos uma sentença onde ref não é traduzido:

O componente Form define uma ref

independente da escolha de traduzir ou não traduzir, devemos atualizar todas as instancias da página para manter consistência.


```js {2,5,10}
function Form() {
Expand All @@ -280,7 +279,7 @@ function Form() {

return (
<form>
<FormField label="Enter your name:" ref={ref} isRequired={true} />
<FormField label="Insira o seu nome:" ref={ref} isRequired={true} />
<button type="button" onClick={handleClick}>
Edit
</button>
Expand All @@ -289,7 +288,7 @@ function Form() {
}
```

The `Form` component defines a ref and passes it to `FormField`. The `FormField` component forwards that ref to `MyInput`, which forwards it to a browser `<input>` DOM node. This is how `Form` accesses that DOM node.
O componente `Form` define uma ref e a passa para `FormField`. O componente `FormField` encaminha essa ref para `MyInput`, que a encaminha para um nó DOM `<input>` do navegador. É assim que `Form` acessa esse nó DOM.


<Sandpack>
Expand All @@ -307,7 +306,7 @@ export default function Form() {

return (
<form>
<FormField label="Enter your name:" ref={ref} isRequired={true} />
<FormField label="Insira o seu nome:" ref={ref} isRequired={true} />
<button type="button" onClick={handleClick}>
Edit
</button>
Expand Down Expand Up @@ -367,9 +366,9 @@ input, button {

---

### Exposing an imperative handle instead of a DOM node {/*exposing-an-imperative-handle-instead-of-a-dom-node*/}
### Expondo um identificador imperativo em vez de um nó DOM {/*exposing-an-imperative-handle-instead-of-a-dom-node*/}

Instead of exposing an entire DOM node, you can expose a custom object, called an *imperative handle,* with a more constrained set of methods. To do this, you'd need to define a separate ref to hold the DOM node:
Em vez de expor um nó DOM inteiro, você pode expor um objeto personalizado, chamado de *imperative handle*, com um conjunto mais restrito de métodos. Para fazer isso, você precisaria definir uma referência separada para manter o nó DOM:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O glossário indica que "DOM Node" deve ser traduzido para "Nó do DOM".


```js {2,6}
const MyInput = forwardRef(function MyInput(props, ref) {
Expand All @@ -381,7 +380,7 @@ const MyInput = forwardRef(function MyInput(props, ref) {
});
```

Pass the `ref` you received to [`useImperativeHandle`](/reference/react/useImperativeHandle) and specify the value you want to expose to the `ref`:
Passe o `ref` que você recebeu para [`useImperativeHandle`](/reference/react/useImperativeHandle) e especifique o valor que você deseja expor ao `ref`:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Em outras partes do página, 'ref' foi tratada no feminino, imagino que para manter consistência com 'referência'. Poderia atualizar as instancias nas quais é usado masculino?


```js {6-15}
import { forwardRef, useRef, useImperativeHandle } from 'react';
Expand All @@ -404,7 +403,7 @@ const MyInput = forwardRef(function MyInput(props, ref) {
});
```

If some component gets a ref to `MyInput`, it will only receive your `{ focus, scrollIntoView }` object instead of the DOM node. This lets you limit the information you expose about your DOM node to the minimum.
Se algum componente obtiver uma referência para `MyInput`, ele receberá apenas seu objeto `{ focus, scrollIntoView }` em vez do nó DOM. Isso permite que você limite as informações que expõe sobre seu nó DOM ao mínimo.

<Sandpack>

Expand All @@ -417,13 +416,13 @@ export default function Form() {

function handleClick() {
ref.current.focus();
// This won't work because the DOM node isn't exposed:
// Isso não funcionará porque o nó DOM não está exposto:
// ref.current.style.opacity = 0.5;
}

return (
<form>
<MyInput placeholder="Enter your name" ref={ref} />
<MyInput placeholder="Insira seu nome" ref={ref} />
<button type="button" onClick={handleClick}>
Edit
</button>
Expand Down Expand Up @@ -463,25 +462,25 @@ input {

</Sandpack>

[Read more about using imperative handles.](/reference/react/useImperativeHandle)
[Leia mais sobre o uso de identificadores imperativos.](/reference/react/useImperativeHandle)

<Pitfall>

**Do not overuse refs.** You should only use refs for *imperative* behaviors that you can't express as props: for example, scrolling to a node, focusing a node, triggering an animation, selecting text, and so on.
**Não use referências em excesso.** Você só deve usar referências para comportamentos *imperativos* que não podem ser expressos como adereços: por exemplo, rolar até um nó, focar um nó, acionar uma animação, selecionar texto e assim por diante.

**If you can express something as a prop, you should not use a ref.** For example, instead of exposing an imperative handle like `{ open, close }` from a `Modal` component, it is better to take `isOpen` as a prop like `<Modal isOpen={isOpen} />`. [Effects](/learn/synchronizing-with-effects) can help you expose imperative behaviors via props.
**Se você pode expressar algo como uma propriedade, não deve usar uma referência.** Por exemplo, em vez de expor um identificador imperativo como `{ open, close }` de um componente `Modal`, é melhor usar `isOpen` como uma propriedade como `<Modal isOpen={isOpen} />`. [Effects](/learn/synchronizing-with-effects) pode ajudar você a expor comportamentos imperativos por meio de propriedades.

</Pitfall>

---

## Troubleshooting {/*troubleshooting*/}
## Solução de problemas {/*troubleshooting*/}

### My component is wrapped in `forwardRef`, but the `ref` to it is always `null` {/*my-component-is-wrapped-in-forwardref-but-the-ref-to-it-is-always-null*/}
### Meu componente está encapsulado em `forwardRef`, mas a `ref` para ele é sempre `null` {/*my-component-is-wrapped-in-forwardref-but-the-ref-to-it-is-always-null*/}

This usually means that you forgot to actually use the `ref` that you received.
Isso geralmente significa que você se esqueceu de usar o `ref` que recebeu.

For example, this component doesn't do anything with its `ref`:
Por exemplo, este componente não faz nada com seu `ref`:

```js {1}
const MyInput = forwardRef(function MyInput({ label }, ref) {
Expand All @@ -494,7 +493,7 @@ const MyInput = forwardRef(function MyInput({ label }, ref) {
});
```

To fix it, pass the `ref` down to a DOM node or another component that can accept a ref:
Para corrigir isso, passe o `ref` para um nó DOM ou outro componente que possa aceitar uma ref:

```js {1,5}
const MyInput = forwardRef(function MyInput({ label }, ref) {
Expand All @@ -507,7 +506,7 @@ const MyInput = forwardRef(function MyInput({ label }, ref) {
});
```

The `ref` to `MyInput` could also be `null` if some of the logic is conditional:
O `ref` para `MyInput` também pode ser `null` se parte da lógica for condicional:

```js {1,5}
const MyInput = forwardRef(function MyInput({ label, showInput }, ref) {
Expand All @@ -520,7 +519,7 @@ const MyInput = forwardRef(function MyInput({ label, showInput }, ref) {
});
```

If `showInput` is `false`, then the ref won't be forwarded to any node, and a ref to `MyInput` will remain empty. This is particularly easy to miss if the condition is hidden inside another component, like `Panel` in this example:
Se `showInput` for `false`, então a ref não será encaminhada para nenhum nó, e uma ref para `MyInput` permanecerá vazia. Isso é particularmente fácil de perder se a condição estiver oculta dentro de outro componente, como `Panel` neste exemplo:

```js {5,7}
const MyInput = forwardRef(function MyInput({ label, showInput }, ref) {
Expand Down