O que é "Montagem" no React js?

128

Estou ouvindo o termo "montar" muitas vezes enquanto aprendo o ReactJS. E parece haver métodos e erros do ciclo de vida em relação a esse termo. O que exatamente o React quer dizer com montagem?

Exemplos: componentDidMount() and componentWillMount()

portões
fonte

Respostas:

138

A principal tarefa do React é descobrir como modificar o DOM para corresponder ao que os componentes desejam que sejam renderizados na tela.

Reaja fazendo isso "montando" (adicionando nós ao DOM), "desmontando" (removendo-os do DOM) e "atualizando" (fazendo alterações nos nós que já estão no DOM).

Como um nó React é representado como um nó DOM e onde e quando ele aparece na árvore DOM é gerenciado pela API de nível superior . Para ter uma idéia melhor do que está acontecendo, veja o exemplo mais simples possível:

// JSX version: let foo = <FooComponent />;
let foo = React.createElement(FooComponent);

Então, o que é fooe o que você pode fazer com isso? foo, no momento, é um objeto JavaScript simples que se parece com isso (simplificado):

{
  type: FooComponent,
  props: {}
}

No momento, ele não está em nenhum lugar da página, ou seja, não é um elemento DOM, não existe em nenhum lugar na árvore DOM e, além de ser o nó do elemento React, não tem outra representação significativa no documento. Apenas informa ao React o que precisa estar na tela se esse elemento React for renderizado. Ainda não está "montado".

Você pode dizer ao React para "montá-lo" em um contêiner DOM chamando:

ReactDOM.render(foo, domContainer);

Isso indica ao React que é hora de mostrar foona página. O React criará uma instância da FooComponentclasse e chamará seu rendermétodo. Digamos que renderize um <div />, nesse caso o React criará um divnó DOM para ele e o inserirá no contêiner DOM.

Esse processo de criação de instâncias e nós DOM correspondentes aos componentes React e a inserção deles no DOM é chamado de montagem.

Observe que normalmente você chamaria apenas ReactDOM.render()para montar o (s) componente (s) raiz (s). Você não precisa "montar" manualmente os componentes filhos. Toda vez que um componente pai chama setState(), e seu rendermétodo diz que um filho em particular deve ser renderizado pela primeira vez, o React automaticamente "monta" esse filho em seu pai.

Filip Dupanović
fonte
9
Gostaria de salientar que, quando você liga, React.createElement(FooComponent)não está criando uma instância de FooComponent. fooé uma representação virtual do DOM, FooComponenttambém conhecido como elemento React. Mas talvez seja isso que você quis dizer com FooComponenttipo de reação . Independentemente, você não monta componentes no React, mas chama render que, por sua vez, pode montar o componente se um nó DOM real precisar ser criado para representar o componente na árvore do DOM. A montagem real é o evento em que isso acontece pela primeira vez.
precisa saber é o seguinte
5
A montagem refere-se à conexão da instância do componente React ao nó DOM, que é necessário para realizar atualizações diferenciais / de renderização incremental em árvore nas chamadas de renderização subsequentes.
precisa saber é o seguinte
3
Tomei a liberdade de editar esta resposta porque ela já foi aceita, mas havia alguns conceitos errados (por exemplo, você não pode executar os findDOMNodeelementos React).
Dan Abramov
1
A desmontagem do @Rahamin acontece quando o componente é removido / substituído, se você navegar entre as cenas de tal maneira que não haja renderização, não é garantido um sinal de desmontagem. componentWillUnmount não é o mesmo que descarregar página.
19430 John Lidegren
1
@Yossi aqui está um exemplo de montagem de forma explícita e un montagem de um componente em um conjunto de testes: stackoverflow.com/a/55359234/6225838
CPHPython
38

React é uma estrutura isomórfica / universal . Isso significa que existe uma representação virtual da árvore de componentes da interface do usuário e é separada da renderização real que ela gera no navegador. A partir da documentação:

A reação é tão rápida, porque nunca fala diretamente com o DOM. O React mantém uma representação rápida na memória do DOM.

No entanto, essa representação na memória não está vinculada diretamente ao DOM no navegador (mesmo que seja chamada Virtual DOM, que é um nome infeliz e confuso para uma estrutura de aplicativos universal) e é apenas um dado do tipo DOM. estrutura que representa toda a hierarquia de componentes da interface do usuário e metadados adicionais. O DOM virtual é apenas um detalhe de implementação.

"Acreditamos que os verdadeiros fundamentos do React são simplesmente idéias de componentes e elementos: poder descrever o que você deseja processar de maneira declarativa. Essas são as partes compartilhadas por todos esses pacotes diferentes. As partes do React são específicas para determinadas renderizações as metas geralmente não são o que pensamos quando pensamos em React ". - Blog do React js

Portanto, a conclusão é que o React está se tornando agnóstico , o que significa que não se importa com o resultado final. Pode ser uma árvore DOM no navegador, pode ser XML, componentes nativos ou JSON.

"Quando analisamos pacotes como react-native, react-art, react-canvas e react-three, ficou claro que a beleza e a essência do React não têm nada a ver com navegadores ou com o DOM". - Blog do React js

Agora que você sabe como o React funciona, é fácil responder à sua pergunta :)

Montagem é o processo de saída da representação virtual de um componente na representação final da interface do usuário (por exemplo, DOM ou Componentes Nativos).

Em um navegador, isso significaria a saída de um React Element para um elemento DOM real (por exemplo, um elemento HTML div ou li ) na árvore DOM. Em um aplicativo nativo, isso significaria a saída de um elemento React em um componente nativo. Você também pode gravar seu próprio renderizador e enviar os componentes do React para JSON ou XML ou mesmo XAML, se tiver coragem.

Portanto, os manipuladores de montagem / desmontagem são críticos para um aplicativo React, porque você só pode ter certeza de que um componente é gerado / renderizado quando montado . No entanto, o componentDidMountmanipulador é chamado apenas ao renderizar para uma representação de interface do usuário real (DOM ou componentes nativos), mas não se você estiver renderizando para uma string HTML no servidor usando renderToString, o que faz sentido, pois o componente não é realmente montado até atingir o valor navegador e executa nele.

E, sim, Mounting também é um nome infeliz / confuso, se você me perguntar. IMHO componentDidRendere componentWillRenderseria nomes muito melhores.

Faris Zacina
fonte
6
Alguém acabou de me apontar para esta resposta de outro fórum. Não acho que componentDidRenderseja um substituto, componentDidMountporque o componente pode renderizar várias vezes quando os objetos são alterados depois de montados uma vez.
Gaurav
@TheMinister Foi chamada de biblioteca "virtual DOM" porque não começou como isomórfica, mas na verdade estava ligada ao DOM desde o início. Foi uma reflexão tardia para torná-lo isomórfico.
Isiah Meadows
Então, mount é intercambiável com render ? Nesse caso, é verdade que um componente é montado / renderizado para cada uma das seguintes hipotéticas ?: (id === that.id) ? <Component /> : null| /app/items/:id| this.setState(...).
Cody
1
Link to / reagem-js-the-king-of-Universal-apps / é quebrado
Michael Freidgeim
Editei o post duas vezes para remover o link quebrado /react-js-the-king-of-universal-apps/( com os comentários de edição claramente mencionando que é um link quebrado ), mas os colegas rejeitaram a edição as duas vezes . Alguém pode me orientar sobre o que há de errado na edição de uma resposta e na remoção de um link quebrado?
Aaditya Sharma
12

Montagem refere-se ao componente em React (nós DOM criados) sendo anexado a alguma parte do documento. É isso aí!

Ignorando React, você pode pensar nessas duas funções nativas como montagem:

replaceChild

appendChild

Quais são provavelmente as funções mais comuns que o React usa para montar internamente.

Imagine:

componentWillMount === antes da montagem

E:

componentDidMount === montagem posterior

frontsideup
fonte
Se a montagem for semelhante a appendChild, o que é render?
Deke
Eu acho que você poderia dizer que renderé o método real que fará a montagem em si. Então componentWillMount== antes, render== faz a inserção DOM, e componentDidMount== depois de montar (ou renderchamou a API DOM para inserir componentes e que a operação assíncrona foi totalmente concluída)
Rob
8

https://facebook.github.io/react/docs/tutorial.html

Aqui, componentDidMount é um método chamado automaticamente pelo React quando um componente é renderizado.

O conceito é que você está dizendo ao ReactJS ", pegue essa coisa, esta caixa de comentários ou imagem giratória ou o que eu quiser na página do navegador, e vá em frente e coloque-a na página do navegador. Quando terminar, ligue para minha função a que me vinculei para componentDidMountque eu possa continuar. "

componentWillMounté o oposto Ele será acionado imediatamente ANTES que o seu componente seja processado.

Veja também aqui https://facebook.github.io/react/docs/component-specs.html

Por fim, o termo "mount" parece exclusivo do react.js. Eu não acho que seja um conceito geral de javascript, ou mesmo um conceito geral de navegador.

Ross Presser
fonte
então montar pode ser chamado de "colocado"?
gates
Eu diria que sim.
Ross Presser
Eu diria que a citação é um pouco enganadora, pois é chamada apenas após a renderização inicial , não nas re-renderizações causadas por atualizações. Então componentDidUpdateé chamado em seu lugar.
Hannes Johansson
+1 para este facebook.github.io/react/docs/… , a descrição lá confirma que foi colocada;)
gates
5

Montagem refere-se ao carregamento da página inicial quando o componente React é renderizado pela primeira vez. Na documentação do React para montagem: componentDidMount:

Invoked once, only on the client (not on the server), immediately after the initial rendering occurs. At this point in the lifecycle, the component has a DOM representation which you can access via React.findDOMNode(this).

Você pode contrastar isso com a função componentDidUpdate, que é chamada toda vez que o React é processado (exceto para a montagem inicial).

Mark Brownsword
fonte
3

O principal objetivo do React js é criar componentes reutilizáveis. Aqui, os componentes são as partes individuais de uma página da web. Por exemplo, em uma página da Web, o cabeçalho é um componente, o rodapé é um componente, uma notificação de brinde é um componente e etc. O termo "montagem" indica que esses componentes são carregados ou renderizados no DOM. Essas são muitas APIs e métodos de nível superior que lidam com isso.

Para simplificar, montado significa que o componente foi carregado no DOM e desmontado significa que os componentes foram removidos do DOM.

Pranesh Ravi
fonte