diff --git a/content/docs/implementation-notes.md b/content/docs/implementation-notes.md
index a035a5edf..608241ee2 100644
--- a/content/docs/implementation-notes.md
+++ b/content/docs/implementation-notes.md
@@ -1,6 +1,6 @@
---
id: implementation-notes
-title: Implementation Notes
+title: Notas de Implementação
layout: contributing
permalink: docs/implementation-notes.html
prev: codebase-overview.html
@@ -9,93 +9,93 @@ redirect_from:
- "contributing/implementation-notes.html"
---
-This section is a collection of implementation notes for the [stack reconciler](/docs/codebase-overview.html#stack-reconciler).
+Esta seção é um conjunto de notas de implementação para o [reconciliador de pilha](/docs/codebase-overview.html#stack-reconciler).
-It is very technical and assumes a strong understanding of React public API as well as how it's divided into core, renderers, and the reconciler. If you're not very familiar with the React codebase, read [the codebase overview](/docs/codebase-overview.html) first.
+Ela é bastante técnica e assume um forte entendimento da API pública do React, assim como da sua divisão em núcleos, renderizadores e o próprio reconciliador. Se você não estiver muito familiarizado com o código do React, leia a [visão geral da base de código](/docs/codebase-overview.html) primeiro.
-It also assumes an understanding of the [differences between React components, their instances, and elements](/blog/2015/12/18/react-components-elements-and-instances.html).
+Também é pressuposto o entendimento da [diferença entre componentes React, suas instâncias e elementos](/blog/2015/12/18/react-components-elements-and-instances.html).
-The stack reconciler was used in React 15 and earlier. It is located at [src/renderers/shared/stack/reconciler](https://github.com/facebook/react/tree/15-stable/src/renderers/shared/stack/reconciler).
+O reconciliador de pilha foi usado no React 15 e em versões anteriores. Está localizado em [src/renderers/shared/stack/reconciler](https://github.com/facebook/react/tree/15-stable/src/renderers/shared/stack/reconciler).
-### Video: Building React from Scratch {#video-building-react-from-scratch}
+### Vídeo: Construindo React do zero {#video-building-react-from-scratch}
-[Paul O'Shannessy](https://twitter.com/zpao) gave a talk about [building React from scratch](https://www.youtube.com/watch?v=_MAD4Oly9yg) that largely inspired this document.
+[Paul O'Shannessy](https://twitter.com/zpao) deu uma palestra sobre [construir React do zero](https://www.youtube.com/watch?v=_MAD4Oly9yg) que muito inspirou esse documento.
-Both this document and his talk are simplifications of the real codebase so you might get a better understanding by getting familiar with both of them.
+Tanto este texto quanto a palestra são simplificações da real base de código, então se familiarizar com os dois pode resultar em um entendimento melhor.
-### Overview {#overview}
+### Visão geral {#overview}
-The reconciler itself doesn't have a public API. [Renderers](/docs/codebase-overview.html#stack-renderers) like React DOM and React Native use it to efficiently update the user interface according to the React components written by the user.
+O reconciliador em si não possui uma API pública. [Renderizadores](/docs/codebase-overview.html#stack-renderers) como o React DOM e React Native usam-no para atualizar a interface do usuário de acordo com os componentes React escritos pelo usuário.
-### Mounting as a Recursive Process {#mounting-as-a-recursive-process}
+### Montagem como um Processo Recursivo {#mounting-as-a-recursive-process}
-Let's consider the first time you mount a component:
+Vamos considerar a primeira vez que você monta um componente:
```js
ReactDOM.render(, rootEl);
```
-React DOM will pass `` along to the reconciler. Remember that `` is a React element, that is, a description of *what* to render. You can think about it as a plain object:
+O React DOM passará `` para o reconciliador. Lembre-se que `` é um elemento React, isto é, uma descrição *do quê* renderizar. Você pode pensar nele como um simples objeto:
```js
console.log();
// { type: App, props: {} }
```
-The reconciler will check if `App` is a class or a function.
+O reconciliador irá verificar se `App` é uma classe ou uma função.
-If `App` is a function, the reconciler will call `App(props)` to get the rendered element.
+Se `App` for uma função, o reconciliador chamará `App(props)` para obter o elemento renderizado.
-If `App` is a class, the reconciler will instantiate an `App` with `new App(props)`, call the `componentWillMount()` lifecycle method, and then will call the `render()` method to get the rendered element.
+Se `App` for uma classe, o reconciliador instanciará `App` com `new App(props)`, chamará o método de ciclo de vida `componentWillMount()`, e por fim chamando o método render()` para obter o elemento renderizado.
-Either way, the reconciler will learn the element `App` "rendered to".
+De qualquer forma, o reconciliador saberá em que elemento o `App` foi "renderizado".
-This process is recursive. `App` may render to a ``, `Greeting` may render to a ``, and so on. The reconciler will "drill down" through user-defined components recursively as it learns what each component renders to.
+Esse processo é recursivo. `App` talvez seja renderizado para um ``, `Greeting` talvez seja renderizado para um ``, e assim por diante. O reconciliador irá “investigar” os componentes definidos pelo usuário recursivamente enquanto ele aprende para o quê cada um será renderizado.
-You can imagine this process as a pseudocode:
+Você pode imaginar esse processo como um pseudo-código:
```js
function isClass(type) {
- // React.Component subclasses have this flag
+ // Subclasses React.Component possuem essa flag
return (
Boolean(type.prototype) &&
Boolean(type.prototype.isReactComponent)
);
}
-// This function takes a React element (e.g. )
-// and returns a DOM or Native node representing the mounted tree.
+// Essa função recebe um elemento React (e.g. )
+// e retorna um DOM ou nó Nativo representando a árvore montada.
function mount(element) {
var type = element.type;
var props = element.props;
- // We will determine the rendered element
- // by either running the type as function
- // or creating an instance and calling render().
+ // Nós vamos determinar o elemento renderizado
+ // executando o tipo como função
+ // ou criando uma instância e chamando render().
var renderedElement;
if (isClass(type)) {
- // Component class
+ // Componente de classe
var publicInstance = new type(props);
- // Set the props
+ // Define as props
publicInstance.props = props;
- // Call the lifecycle if necessary
+ // Chama o ciclo de vida se necessário
if (publicInstance.componentWillMount) {
publicInstance.componentWillMount();
}
- // Get the rendered element by calling render()
+ // Obtêm o elemento renderizado ao chamar render()
renderedElement = publicInstance.render();
} else {
- // Component function
+ // Componente de função
renderedElement = type(props);
}
- // This process is recursive because a component may
- // return an element with a type of another component.
+ // Esse processo é recursivo pois um componente pode
+ // retornar um elemento com o tipo de outro componente.
return mount(renderedElement);
- // Note: this implementation is incomplete and recurses infinitely!
- // It only handles elements like or .
- // It doesn't handle elements like
or yet.
+ // Nota: essa implementação é incompleta e recorre infinitamente!
+ // Ela só lida com elementos ou .
+ // Ela não lida com elementos como ou ainda.
}
var rootEl = document.getElementById('root');
@@ -103,81 +103,81 @@ var node = mount();
rootEl.appendChild(node);
```
->**Note:**
+>**Nota:**
>
->This really *is* a pseudo-code. It isn't similar to the real implementation. It will also cause a stack overflow because we haven't discussed when to stop the recursion.
+>Isso realmente *é* um pseudocódigo. Não é semelhante a implementação real. Causará um estouro de pilha porque não discutimos quando parar a recursão.
-Let's recap a few key ideas in the example above:
+Recapitulando alguns conceitos chaves do exemplo acima:
-* React elements are plain objects representing the component type (e.g. `App`) and the props.
-* User-defined components (e.g. `App`) can be classes or functions but they all "render to" elements.
-* "Mounting" is a recursive process that creates a DOM or Native tree given the top-level React element (e.g. ``).
+* Os elementos do React são objetos simples que representam o tipo do componente (e.g. `App`) e as props.
+* Componentes definidos pelo usuário (e.g. `App`) podem ser classes ou funções mas todos eles “se renderizam” a um elemento.
+* "Montagem" é um processo recursivo que cria uma árvore DOM ou Nativa dado um elemento React de nível superior (e.g. ``).
-### Mounting Host Elements {#mounting-host-elements}
+### Montando Elementos Hospedeiros {#mounting-host-elements}
-This process would be useless if we didn't render something to the screen as a result.
+Esse processo seria inútil se o resultado não fosse renderizar algo na tela.
-In addition to user-defined ("composite") components, React elements may also represent platform-specific ("host") components. For example, `Button` might return a `` from its render method.
+Além dos componentes definidos pelo usuário ("compostos"), elementos React podem também representar componentes ("hospedeiros") para plataformas específicas. Por exemplo, `Button` pode retornar uma `` no seu método render.
-If element's `type` property is a string, we are dealing with a host element:
+Se a propriedade `type` for uma string, estamos lidando com um elemento hospedeiro:
```js
console.log();
// { type: 'div', props: {} }
```
-There is no user-defined code associated with host elements.
+Não há código definido pelo usuário associado com elementos do tipo hospedeiro.
-When the reconciler encounters a host element, it lets the renderer take care of mounting it. For example, React DOM would create a DOM node.
+Quando o reconciliador encontra um elemento hospedeiro, ele permite que o renderizador cuide da montagem. Por exemplo, o React DOM criaria um nó do DOM.
-If the host element has children, the reconciler recursively mounts them following the same algorithm as above. It doesn't matter whether children are host (like `
`), composite (like ``), or both.
+Se o elemento hospedeiro possuir filhos, o reconciliador recursivamente os monta seguindo o mesmo algoritmo descrito acima. Não importa se os filhos são hospedeiros (como `
`) ou se são compostos (como ``), ou os dois.
-The DOM nodes produced by the child components will be appended to the parent DOM node, and recursively, the complete DOM structure will be assembled.
+Os nós DOM produzidos pelos componentes filhos serão anexados ao nó DOM pai, e, recursivamente, a completa estrutura DOM será construída.
->**Note:**
+>**Nota:**
>
->The reconciler itself is not tied to the DOM. The exact result of mounting (sometimes called "mount image" in the source code) depends on the renderer, and can be a DOM node (React DOM), a string (React DOM Server), or a number representing a native view (React Native).
+>O reconciliador em si não está ligado ao DOM. O exato resultado da montagem (por vezes chamada de "mount image" no código fonte) depende do renderizador, e pode ser um nó do DOM (React DOM), uma string (React DOM Server), ou um número representando uma view nativa (React Native).
-If we were to extend the code to handle host elements, it would look like this:
+Se fôssemos estender o código para lidar com elementos hospedeiros, ficaria assim:
```js
function isClass(type) {
- // React.Component subclasses have this flag
+ // Subclasses React.Component possuem essa flag
return (
Boolean(type.prototype) &&
Boolean(type.prototype.isReactComponent)
);
}
-// This function only handles elements with a composite type.
-// For example, it handles and , but not a .
+// Essa função apenas lida com elementos do tipo composto.
+// Por exemplo, ela lida com e , mas não com uma .
function mountComposite(element) {
var type = element.type;
var props = element.props;
var renderedElement;
if (isClass(type)) {
- // Component class
+ // Componente de classe
var publicInstance = new type(props);
- // Set the props
+ // Define as props
publicInstance.props = props;
- // Call the lifecycle if necessary
+ // Chama o ciclo de vida se necessário
if (publicInstance.componentWillMount) {
publicInstance.componentWillMount();
}
renderedElement = publicInstance.render();
} else if (typeof type === 'function') {
- // Component function
+ // Componente de função
renderedElement = type(props);
}
- // This is recursive but we'll eventually reach the bottom of recursion when
- // the element is host (e.g. ) rather than composite (e.g. ):
+ // Isso é recursivo mas eventualmente chegaremos no fim da recursão quando
+ // o elemento for o hospedeiro (e.g. ) ao invés de composto (e.g. ):
return mount(renderedElement);
}
-// This function only handles elements with a host type.
-// For example, it handles and but not an .
+// Essa função apenas lida com elementos do tipo hospedeiro.
+// Por exemplo, ela lida com e mas não com um
function mountHost(element) {
var type = element.type;
var props = element.props;
@@ -187,9 +187,9 @@ function mountHost(element) {
}
children = children.filter(Boolean);
- // This block of code shouldn't be in the reconciler.
- // Different renderers might initialize nodes differently.
- // For example, React Native would create iOS or Android views.
+ // Esse bloco de código não deveria estar no reconciliador.
+ // Renderizadores diferentes podem inicializar nós diferentemente.
+ // Por exemplo, React Native iria criar views de iOS ou Android.
var node = document.createElement(type);
Object.keys(props).forEach(propName => {
if (propName !== 'children') {
@@ -197,29 +197,29 @@ function mountHost(element) {
}
});
- // Mount the children
+ // Monta os filhos
children.forEach(childElement => {
- // Children may be host (e.g. ) or composite (e.g. ).
- // We will also mount them recursively:
+ // Filhos podem ser hospedeiros (e.g. ) ou compostos (e.g ).
+ // Também os montaremos recursivamente:
var childNode = mount(childElement);
- // This line of code is also renderer-specific.
- // It would be different depending on the renderer:
+ // Essa linha de código também é específica do renderizador.
+ // Ela seria diferente dependendo do renderizador:
node.appendChild(childNode);
});
- // Return the DOM node as mount result.
- // This is where the recursion ends.
+ // Retorna o nó do DOM como resultado da montagem.
+ // Aqui é onde a recursão acaba.
return node;
}
function mount(element) {
var type = element.type;
if (typeof type === 'function') {
- // User-defined components
+ // Componentes definidos pelo usuário
return mountComposite(element);
} else if (typeof type === 'string') {
- // Platform-specific components
+ // Componentes de plataformas específicas
return mountHost(element);
}
}
@@ -229,40 +229,40 @@ var node = mount();
rootEl.appendChild(node);
```
-This is working but still far from how the reconciler is really implemented. The key missing ingredient is support for updates.
+Isto funciona mas ainda está longe de como o reconciliador é realmente implementado. O ingrediente que falta é o suporte para atualizações.
-### Introducing Internal Instances {#introducing-internal-instances}
-The key feature of React is that you can re-render everything, and it won't recreate the DOM or reset the state:
+### Introduzindo instâncias Internas {#introducing-internal-instances}
+A característica principal do React é que você pode re-renderizar tudo, e ele não irá recriar o DOM ou resetar o estado.
```js
ReactDOM.render(, rootEl);
-// Should reuse the existing DOM:
+// Deve reutilizar o DOM existente:
ReactDOM.render(, rootEl);
```
-However, our implementation above only knows how to mount the initial tree. It can't perform updates on it because it doesn't store all the necessary information, such as all the `publicInstance`s, or which DOM `node`s correspond to which components.
+Contudo, a nossa implementação acima apenas sabe como montar a árvore inicial. Ela não executa atualizações na árvore pois não armazena todas as informações necessárias, como todas as `publicInstance`s, ou quais nós do DOM correspondem a qual componente.
-The stack reconciler codebase solves this by making the `mount()` function a method and putting it on a class. There are drawbacks to this approach, and we are going in the opposite direction in the [ongoing rewrite of the reconciler](/docs/codebase-overview.html#fiber-reconciler). Nevertheless this is how it works now.
+O código do reconciliador de pilha resolve isso fazendo a função `mount()` um método e a colocando em uma classe. Existem desvantagens para essa abordagem, e nos iremos na direção oposta na [atual reescrita do reconciliador](/docs/codebase-overview.html#fiber-reconciler). No entanto, é assim que funciona atualmente.
-Instead of separate `mountHost` and `mountComposite` functions, we will create two classes: `DOMComponent` and `CompositeComponent`.
+Ao invés de funções `mountHost` e `mountComposite` separadas, nós criaremos duas classes: `DOMComponent` e `CompositeComponent`.
-Both classes have a constructor accepting the `element`, as well as a `mount()` method returning the mounted node. We will replace a top-level `mount()` function with a factory that instantiates the correct class:
+Ambas as classes possuem um construtor aceitando o `element`, assim como um método `mount()` retornando o nó montado. Nós iremos trocar a função de nível superior `mount()` com uma _factory_ que instancia a classe correta.
```js
function instantiateComponent(element) {
var type = element.type;
if (typeof type === 'function') {
- // User-defined components
return new CompositeComponent(element);
+ // Componentes definidos pelo usuário
} else if (typeof type === 'string') {
- // Platform-specific components
+ // Componentes de plataformas específicas
return new DOMComponent(element);
}
}
```
-First, let's consider the implementation of `CompositeComponent`:
+Primeiro, vamos considerar a implementação de `CompositeComponent`:
```js
class CompositeComponent {
@@ -273,7 +273,7 @@ class CompositeComponent {
}
getPublicInstance() {
- // For composite components, expose the class instance.
+ // Para componentes compostos, exponha a instância da classe.
return this.publicInstance;
}
@@ -285,45 +285,45 @@ class CompositeComponent {
var publicInstance;
var renderedElement;
if (isClass(type)) {
- // Component class
+ // Componente de classe
publicInstance = new type(props);
- // Set the props
+ // Define as props
publicInstance.props = props;
- // Call the lifecycle if necessary
+ // Chama o ciclo de vida se necessário
if (publicInstance.componentWillMount) {
publicInstance.componentWillMount();
}
renderedElement = publicInstance.render();
} else if (typeof type === 'function') {
- // Component function
+ // Componente de função
publicInstance = null;
renderedElement = type(props);
}
- // Save the public instance
+ // Salva a instância pública
this.publicInstance = publicInstance;
- // Instantiate the child internal instance according to the element.
- // It would be a DOMComponent for or ,
- // and a CompositeComponent for or :
+ // Instancia a instância interna filha de acordo com o elemento.
+ // Seria algo como um DOMComponent para ou ,
+ // e um CompositeComponent para ou :
var renderedComponent = instantiateComponent(renderedElement);
this.renderedComponent = renderedComponent;
- // Mount the rendered output
+ // Monta o output renderizado
return renderedComponent.mount();
}
}
```
-This is not much different from our previous `mountComposite()` implementation, but now we can save some information, such as `this.currentElement`, `this.renderedComponent`, and `this.publicInstance`, for use during updates.
+Isso não é muito diferente da nossa implementação anterior de `mountComposite`, mas agora podemos salvar algumas informações, como `this.currentElement`, `this.renderedComponent`, e `this.publicInstance` , para usar durante atualizações.
-Note that an instance of `CompositeComponent` is not the same thing as an instance of the user-supplied `element.type`. `CompositeComponent` is an implementation detail of our reconciler, and is never exposed to the user. The user-defined class is the one we read from `element.type`, and `CompositeComponent` creates an instance of it.
+Note que uma instância de `CompositeComponent` não é a mesma coisa que uma instância de um `element.type` fornecida pelo usuário. `CompositeComponent` é um detalhe de implementação do nosso reconciliador e nunca é exposto para o usuário. A classe definida pelo usuário é quem lê de `element.type` e `CompositeComponent` cria uma instância dela.
-To avoid the confusion, we will call instances of `CompositeComponent` and `DOMComponent` "internal instances". They exist so we can associate some long-lived data with them. Only the renderer and the reconciler are aware that they exist.
+Para evitar confusão, nós vamos chamar instâncias de `CompositeComponent` e `DOMComponent` de "instâncias internas". Elas existem para que possamos associá-las a alguns dados de longa vida. Apenas o renderizador e o reconciliador sabem que elas existem.
-In contrast, we call an instance of the user-defined class a "public instance". The public instance is what you see as `this` in the `render()` and other methods of your custom components.
+Em contraste, nós chamamos uma instância de uma classe definida pelo usuário uma "instância pública". A instância pública é o que você vê como `this` no `render()` e outros métodos de seus componentes customizados.
-The `mountHost()` function, refactored to be a `mount()` method on `DOMComponent` class, also looks familiar:
+A função `mountHost()`, refatorada para ser um método `mount()` na classe `DOMComponent`, também é familiar:
```js
class DOMComponent {
@@ -347,36 +347,36 @@ class DOMComponent {
children = [children];
}
- // Create and save the node
+ // Cria e salva o nó
var node = document.createElement(type);
this.node = node;
- // Set the attributes
+ // Define os atributos
Object.keys(props).forEach(propName => {
if (propName !== 'children') {
node.setAttribute(propName, props[propName]);
}
});
- // Create and save the contained children.
- // Each of them can be a DOMComponent or a CompositeComponent,
- // depending on whether the element type is a string or a function.
+ // Cria e salva os filhos contidos.
+ // Cada um deles pode ser um DOMComponent ou um CompositeComponent
+ // dependendo se o tipo do elemento é uma string ou uma função.
var renderedChildren = children.map(instantiateComponent);
this.renderedChildren = renderedChildren;
- // Collect DOM nodes they return on mount
+ // Coleta nos DOM retornados na montagem
var childNodes = renderedChildren.map(child => child.mount());
childNodes.forEach(childNode => node.appendChild(childNode));
- // Return the DOM node as mount result
+ // Retorna o nó do DOM como resultado da montagem
return node;
}
}
```
-The main difference after refactoring from `mountHost()` is that we now keep `this.node` and `this.renderedChildren` associated with the internal DOM component instance. We will also use them for applying non-destructive updates in the future.
+A diferença principal depois de refatorar `mountHost()` é que agora nós podemos deixar `this.node` e `this.renderedChildren` associados com a instância interna do componente DOM. Nós também os usaremos para aplicar atualizações não destrutivas no futuro.
-As a result, each internal instance, composite or host, now points to its child internal instances. To help visualize this, if a function `` component renders a `