You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/content/learn/tutorial-tic-tac-toe.md
+16-16Lines changed: 16 additions & 16 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -797,7 +797,7 @@ function Square() {
797
797
}
798
798
```
799
799
800
-
Ao chamar essa função `set` a partir de um manipulador `onClick`, você está dizendo ao React para re-renderizar aquele `Square` sempre que o seu `<button>` for clicado. Depois da atualização, o `value` de `Square` será `'X'`, então você verá o "X" no tabuleiro do jogo. Clique em qualquer Square, e "X" deve aparecer:
800
+
Ao chamar essa função `set` a partir de um manipulador `onClick`, você está dizendo ao React para rerrenderizar aquele `Square` sempre que o seu `<button>` for clicado. Depois da atualização, o `value` de `Square` será `'X'`, então você verá o "X" no tabuleiro do jogo. Clique em qualquer Square, e "X" deve aparecer:
801
801
802
802

803
803
@@ -1129,7 +1129,7 @@ export default function Board() {
1129
1129
1130
1130
A função `handleClick` cria uma cópia do array `squares` (`nextSquares`) com o método de Array JavaScript `slice()`. Então, `handleClick` atualiza o array `nextSquares` para adicionar `X` ao primeiro (índice `[0]`) quadrado.
1131
1131
1132
-
Chamar a função `setSquares` permite que o React saiba que o state do componente mudou. Isso irá acionar uma re-renderização dos componentes que usa o state `squares` (`Board`) bem como seus componentes filhos (os componentes `Square` que fazem parte do tabuleiro).
1132
+
Chamar a função `setSquares` permite que o React saiba que o state do componente mudou. Isso irá acionar uma rerrenderização dos componentes que usa o state `squares` (`Board`) bem como seus componentes filhos (os componentes `Square` que fazem parte do tabuleiro).
1133
1133
1134
1134
<Note>
1135
1135
@@ -1161,11 +1161,11 @@ A seguir, você precisará passar aquele `i` a `handleClick`. Você pode tentar
Aqui está o razão pela qual isso não funciona. A chamada `handleClick(0)` será parte da renderização do componente do tabuleiro. Como `handleClick(0)` altera o state do componente do tabuleiro ao chamar `setSquares`, seu componente de tabuleiro todo será re-renderizado novamente. Mas isso executa `handleClick(0)` de novo, levando a um um loop infinito:
1164
+
Aqui está o razão pela qual isso não funciona. A chamada `handleClick(0)` será parte da renderização do componente do tabuleiro. Como `handleClick(0)` altera o state do componente do tabuleiro ao chamar `setSquares`, seu componente de tabuleiro todo será rerrenderizado novamente. Mas isso executa `handleClick(0)` de novo, levando a um um loop infinito:
1165
1165
1166
1166
<ConsoleBlock level="error">
1167
1167
1168
-
Muitas re-renderizações. O React limita o número de renderizações para previnir um loop infinito.
1168
+
Muitas rerrenderizações. O React limita o número de renderizações para previnir um loop infinito.
1169
1169
1170
1170
</ConsoleBlock>
1171
1171
@@ -1317,13 +1317,13 @@ body {
1317
1317
1318
1318
</Sandpack>
1319
1319
1320
-
Agora que sua manipulação de state está no componente `Board`, o componente pai `Board` passa props aos componentes filhos `Square` para que eles possam ser exibidos corretamente. Ao clicar em um `Square`, o componente filho `Square` agora pede ao componente pai `Board` que atualize o state do tabuleiro. Quando o state de `Board` muda, ambos o componente `Board` e cada filho `Square`re-renderizam automaticamente. Manter o state de todos os quadrados no componente `Board` o permitirá determinar o vencedor no futuro.
1320
+
Agora que sua manipulação de state está no componente `Board`, o componente pai `Board` passa props aos componentes filhos `Square` para que eles possam ser exibidos corretamente. Ao clicar em um `Square`, o componente filho `Square` agora pede ao componente pai `Board` que atualize o state do tabuleiro. Quando o state de `Board` muda, ambos o componente `Board` e cada filho `Square`rerrenderizam automaticamente. Manter o state de todos os quadrados no componente `Board` o permitirá determinar o vencedor no futuro.
1321
1321
1322
1322
Vamos recapitular o que acontece quando um usuário clica no quadrado superior esquerdo em seu tabuleiro para adicionar um `X` a ele:
1323
1323
1324
1324
1. Clicar no quadrado superior esquerdo executra a função que `button` recebeu como sua prop `onClick` de `Square`. O componente `Square` receber aquela função como sua prop `onSquareClick` de `Board`. O componente `Board` definiu aquela função diretamente na JSX. Ela chama `handleClick`com um argumento de `0`.
1325
1325
1. `handleClick` usa o argumento (`0`) para atualizar o primeiro elemento do array `squares` de `null` para `X`.
1326
-
1. O state `square` do componente `Board` foi atualizado, então `Board` e todos os seus filhos re-renderizam. Isso faz com que a prop `value` do componente `Square` de índice `0` mude de `null` para `X`.
1326
+
1. O state `square` do componente `Board` foi atualizado, então `Board` e todos os seus filhos rerrenderizam. Isso faz com que a prop `value` do componente `Square` de índice `0` mude de `null` para `X`.
1327
1327
1328
1328
No final o usuário vê que o quadrado superior esquerdo mudou de vazio para ter um `X` depois de clicar nele.
1329
1329
@@ -1357,7 +1357,7 @@ O resultado é o mesmo mas ao não mutar (alterar os dados subjacentes) diretame
1357
1357
1358
1358
Imutabilidade torna recursos complexos muito mais fáceis de se implementar. Mais tarde neste tutorial, você implementará uma função de "viagem no tempo" a qual permite que você avalie o histórico do jogo e "pule de volta" a movimentos passados. Essa funcionalidade não é específica aos jogos--a habilidade de desfazer e refazer certas ações é um requerimento comum para aplicativos. Evitar a mutação direta de dados permite que você mantenha versões prévias dos dados intactas e as reutilize mais tarde.
1359
1359
1360
-
Há também outro benefício da imutabilidade. Por padrão, todos os componentes filhos re-renderizam automaticamente quando o state de um componente pai muda. Isso inclui até os componentes filhos que não foram afetados pela mudança. Mesmo que a re-renderização em si não seja perceptível ao usuário (você não deveria ativamente tentar evitá-la), você pode querer pular a re-renderização de uma parte da árvore que claramente não foi afetada por razões de performance. Imutabilidade torna muito barato para os componentes compararem se seus dados foram alterados ou não. Você pode aprender mais sobre como o React escolhe quando re-renderizar um componente na [referência da API `memo`](/reference/react/memo).
1360
+
Há também outro benefício da imutabilidade. Por padrão, todos os componentes filhos rerrenderizam automaticamente quando o state de um componente pai muda. Isso inclui até os componentes filhos que não foram afetados pela mudança. Mesmo que a rerrenderização em si não seja perceptível ao usuário (você não deveria ativamente tentar evitá-la), você pode querer pular a rerrenderização de uma parte da árvore que claramente não foi afetada por razões de performance. Imutabilidade torna muito barato para os componentes compararem se seus dados foram alterados ou não. Você pode aprender mais sobre como o React escolhe quando rerrenderizar um componente na [referência da API `memo`](/reference/react/memo).
O componente `Board` é completamente controlado pelas props passadas a ele pelo componente `Game`. Você precisará implementar a função `handlePlay` no componente `Game` para fazer com que o jogo funcione novamente.
1851
1851
1852
-
O que `handlePlay` deveria fazer quando chamada? Lembre-se que Board costumava chamar `setSquares`com um array atualizado; agora ele passa o array `squares` atualizado a `onPlay`.
1852
+
O que `handlePlay` deveria fazer quando chamada? Lembre-se que Board costumava chamar `setSquares`com um array atualizado; agora ele passa o array `squares` atualizado a `onPlay`.
1853
1853
1854
-
A função `handlePlay` precisa atualizar o state de `Game` para acionar uma re-renderização, mas você não tem mais uma função `setSquares` que você possa chamar--você agora está usando a variável de state `history` para armazenar esta informação. Você gostará de atualizar `history` anexando o array atualizado `squares` como uma nova entrada no histórico. Você também gostará de alternar `xIsNext`, assim como Board costumava fazer:
1854
+
A função `handlePlay` precisa atualizar o state de `Game` para acionar uma rerrenderização, mas você não tem mais uma função `setSquares`a qual possa chamar--agora você está usando a variável de state `history` para armazenar essa informação. Você vai querer atualizar `history` anexando o array atualizado `squares` como uma nova entrada no histórico. Você também gostará de alternar `xIsNext`, assim como Board costumava fazer:
1855
1855
1856
1856
```js {4-5}
1857
1857
exportdefaultfunctionGame() {
@@ -2274,21 +2274,21 @@ Em adição às contagens atualizadas, um humano lendo isso provavelmente diria
2274
2274
</li>
2275
2275
```
2276
2276
2277
-
Quando uma lista é re-renderizada, o React usa a key de cada item da lista e procura nos itens da lista anterior por uma chave que combine. Se a lista atual possui uma key que não existia antes, o React cria um componente. Se na lista atual está faltando uma chave que existia na lista anterior, o React destrói o componente anterior. Se duas chaves são iguais, o componente correspondente é movido.
2277
+
Quando uma lista é rerrenderizada, o React usa a key de cada item da lista e procura nos itens da lista anterior por uma chave que combine. Se a lista atual possui uma key que não existia antes, o React cria um componente. Se na lista atual está faltando uma chave que existia na lista anterior, o React destrói o componente anterior. Se duas chaves são iguais, o componente correspondente é movido.
2278
2278
2279
-
Keys dizem ao React sobre a identidade de cada componente, o que permite ao React manter o state entre re-renderizações. Se a key de um componente muda, o componente será destruído e re-criado com um novo state.
2279
+
Keys dizem ao React sobre a identidade de cada componente, o que permite ao React manter o state entre rerrenderizações. Se a key de um componente muda, o componente será destruído e recriado com um novo state.
2280
2280
2281
2281
`key` é uma propriedade especial e reservada em React. Quando um elemento é criado, o React extrai a propriedade `key` e a salva diretamente no elemento retornado. Mesmo que a `key` possa parecer como se fosse passada como uma prop, o React automaticamente usa `key` para decidir quais componente a atualizar. Não há maneira para que um componente peça qual `key` seu pai especificou.
2282
2282
2283
-
**É fortemente recomendado que você designe keys apropriadas sempre que construindo listas dinâmicas.** Se você não tiver uma key apropriada, você pode considerar a reestruturação de seus dados para que você tenha.
2283
+
**É fortemente recomendado que você designe keys apropriadas sempre que estiver construindo listas dinâmicas.** Se você não tiver uma key apropriada, você pode considerar a reestruturação de seus dados para que você tenha.
2284
2284
2285
2285
Se nenhuma key é especificada, o React irá reportar um erro e usará o índice do array como key por padrão. Usar o índice do array como key é problemático ao tentar re-ordenar os items de uma lista ou inserindo/removendo items da lista. Passar explicitamente `key={i}` silencia esses erros mas tem os mesmo problemas que índices de array e não é recomendado na maioria dos casos.
2286
2286
2287
2287
Keys não precisam ser globalmente únicas; elas só precisam ser únicas entre componentes e seus filhos.
2288
2288
2289
2289
### Implementando viagem no tempo {/*implementing-time-travel*/}
2290
2290
2291
-
No histórico do jogo da velha, cada movimento passado possui um ID único associado com ele: é o número sequential do movimento. Movimentos nunca serão re-ordenador, excluídos, ou inseridos no meio, então é seguro usar o índice do movimento como key.
2291
+
No histórico do jogo da velha, cada movimento passado possui um ID único associado com ele: é o número sequencial do movimento. Movimentos nunca serão reordenados, excluídos, ou inseridos no meio, então é seguro usar o índice do movimento como key.
2292
2292
2293
2293
Na função `Game`, você pode adicionar a key como `<li key={move}>`, e se você recarregar o jogo renderizado, o erro de "key" do React deveria desaparecer:
2294
2294
@@ -2695,7 +2695,7 @@ body {
2695
2695
2696
2696
### Limpeza final {/*final-cleanup*/}
2697
2697
2698
-
Se você olhar para o código bastante atenção, você pode perceber que `xIsNext ===true` quando `currentMove` é par e `xIsNext ===false` quando `currentMove` é ímpar. Em outras palavras, se você sabe o valor de `currentMove`, então você sempre pode descobrir o que `xIsNext` deveria ser.
2698
+
Se você olhar para o código bastante atenção, pode perceber que `xIsNext ===true` quando `currentMove` é par e `xIsNext ===false` quando `currentMove` é ímpar. Em outras palavras, se você sabe o valor de `currentMove`, então você sempre pode descobrir o que `xIsNext` deveria ser.
2699
2699
2700
2700
Não há razão para armazenar ambos em state. De fato, sempre tente evitar state redundante. A simplificação do que você armazena em state reduz bugs e faz do seu código mais fácil de entender. Mude `Game` para que ele não armazene mais `xIsNext` como uma variável de state separada e em vez disso a descubra com base em `currentMove`:
2701
2701
@@ -2901,12 +2901,12 @@ body {
2901
2901
2902
2902
</Sandpack>
2903
2903
2904
-
Se você tem tempo extra ou quer praticar suas novas habilidades de React, aqui estão algumas ideias de melhorias que você poderia fazer ao jogo da velha, listadas em ordem de dificuldade incremental:
2904
+
Se você tem tempo extra ou quer praticar suas novas habilidades de React, aqui estão algumas ideias de melhorias que você poderia fazer ao jogo da velha, listadas em ordem de dificuldade crescente:
2905
2905
2906
2906
1. Apenas para o movimento atual, mostre "Você está no movimento #..." em vez de um botão.
2907
2907
1. Reescreva `Board` para que use dois loops que façam quadrados em vez de codificá-los.
2908
2908
1. Adicione um botão alternador que permite que você ordene os movimento em ordem ascendente ou descendente.
2909
2909
1. Quando alguém ganhar, sublinhe os três quadrados que causaram a vitória (e quando ninguém ganhar, exiba uma mensagem sobre o resultado ter sido um empate).
2910
2910
1. Exiba a localização de cada movimento no formato (linha, coluna) e mova a lista do histórico.
2911
2911
2912
-
Ao longo desse tutorial, você entrou em contato com conceitos do React incluindo elementos, componentes, props e state. Agora que você viu como esses conceitos funcionam quando construindo um jogo, veja [Pensando em React](/learn/thinking-in-react) para ver como os mesmos conceitos do React funcionam ao construir a UI de um aplicativo.
2912
+
Ao longo desse tutorial, você entrou em contato com conceitos do React incluindo elementos, componentes, props e state. Agora que você viu como esses conceitos funcionam construindo um jogo, veja [Pensando em React](/learn/thinking-in-react) para entender como os mesmos conceitos do React funcionam ao construir a UI de um aplicativo.
0 commit comments