Este é um exemplo da página do aplicativo Google Adsense. A tela de carregamento exibida antes da página principal foi exibida depois.
Não sei como fazer a mesma coisa com o React, porque se eu fizer a tela de carregamento renderizada pelo componente React, ela não será exibida enquanto a página estiver carregando, pois precisará aguardar o DOM renderizado anteriormente.
Atualizada :
Fiz um exemplo da minha abordagem colocando o carregador de tela index.html
e removendo-o no ReactcomponentDidMount()
método do ciclo de vida do .
reactjs
asynchronous
redux
Thanh Nguyen
fonte
fonte
Respostas:
Isso pode ser feito colocando o ícone de carregamento no seu arquivo html (index.html para ex), para que os usuários vejam o ícone imediatamente após o carregamento do arquivo html.
Quando o aplicativo termina o carregamento, você pode simplesmente remover esse ícone de carregamento em um gancho do ciclo de vida, geralmente faço isso
componentDidMount
.fonte
O objetivo
Quando a página html for renderizada, exiba um botão giratório imediatamente (enquanto o React carrega) e oculte-o depois que o React estiver pronto.
Como o girador é renderizado em HTML / CSS puro (fora do domínio React), o React não deve controlar diretamente o processo de exibição / ocultação, e a implementação deve ser transparente ao React.
Solução 1 - a: pseudo classe vazia
Como você processa o reagir em um contêiner DOM -
<div id="app"></div>
, você pode adicionar um giratório a esse contêiner e, quando o reagir for carregado e renderizado, o girador desaparecerá.Você não pode adicionar um elemento DOM (uma div, por exemplo) dentro da raiz do reag, pois o React substituirá o conteúdo do contêiner assim que
ReactDOM.render()
for chamado. Mesmo se você renderizarnull
, o conteúdo ainda será substituído por um comentário -<!-- react-empty: 1 -->
. Isso significa que, se você deseja exibir o carregador enquanto o componente principal monta, os dados estão sendo carregados, mas nada é renderizado, uma marcação do carregador colocada dentro do contêiner (<div id="app"><div class="loader"></div></div>
por exemplo) não funcionaria.Uma solução alternativa é adicionar a classe giratória ao contêiner de reação e usar a
:empty
pseudo classe . O botão giratório ficará visível, desde que nada seja renderizado no contêiner (os comentários não contam). Assim que a reação renderizar algo diferente de comentar, o carregador desaparecerá.Exemplo 1
No exemplo, você pode ver um componente que é renderizado
null
até que esteja pronto. O contêiner também é o carregador -<div id="app" class="app"></div>
e a classe do carregador só funcionará se for:empty
(veja os comentários no código):Mostrar snippet de código
Exemplo 2
Uma variação no uso da
:empty
pseudo classe para mostrar / ocultar um seletor está configurando o botão giratório como um elemento irmão para o contêiner do aplicativo e mostrando-o enquanto o contêiner estiver vazio usando o combinador de irmãos adjacente (+
):Mostrar snippet de código
Solução 2 - Passe "manipuladores" giratórios como acessórios
Para ter um controle mais refinado sobre o estado de exibição dos giradores, crie duas funções
showSpinner
ehideSpinner
, e passá-las para o recipiente raiz via adereços. As funções podem manipular o DOM ou fazer o que for necessário para controlar o controle giratório. Dessa maneira, o React não está ciente do "mundo exterior", nem precisa controlar o DOM diretamente. Você pode substituir facilmente as funções para teste ou, se precisar alterar a lógica, e pode passá-las para outros componentes na árvore do React.Exemplo 1
Mostrar snippet de código
Exemplo 2 - ganchos
Este exemplo usa o
useEffect
gancho para ocultar o botão giratório após a montagem do componente.Mostrar snippet de código
fonte
A solução alternativa para isso é:
Na sua função de renderização, faça algo assim:
Inicialize isLoading como true no construtor e false em componentDidMount
fonte
Se alguém que procura uma biblioteca drop-in, configuração zero e dependência zero para o caso de uso acima, tente pace.js ( http://github.hubspot.com/pace/docs/welcome/ ).
Ele se conecta automaticamente a eventos (ajax, readyState, history pushstate, loop de eventos js etc.) e mostra um carregador personalizável.
Funcionou bem com nossos projetos de reagir / retransmitir (lida com alterações de navegação usando reat -router, solicitações de retransmissão) (Não afiliado; havia usado o pace.js em nossos projetos e funcionou muito bem)
fonte
public/index.html
e escolher um estilo. isso é absolutamente simples, plugin incrível. obrigado.Quando o aplicativo React é massivo, leva muito tempo para que ele funcione após a página ser carregada. Digamos que você monte sua parte do React no aplicativo
#app
. Normalmente, esse elemento no seu index.html é simplesmente uma div vazia:O que você pode fazer é colocar um pouco de estilo e um monte de imagens para melhorar a aparência entre o carregamento da página e a renderização inicial do aplicativo React no DOM:
Após o carregamento da página, o usuário verá imediatamente o conteúdo original de index.html. Logo após, quando o React estiver pronto para montar toda a hierarquia de componentes renderizados neste nó DOM, o usuário verá o aplicativo real.
Nota
class
nãoclassName
. É porque você precisa colocar isso no seu arquivo html.Se você usa o SSR, as coisas ficam menos complicadas porque o usuário realmente vê o aplicativo real logo após o carregamento da página.
fonte
Isso acontecerá antes de
ReactDOM.render()
assumir o controle da raiz<div>
. Ou seja, seu aplicativo não terá sido montado até esse ponto.Então você pode adicionar seu carregador no seu
index.html
arquivo dentro da raiz<div>
. E isso ficará visível na tela até o React assumir o controle.Você pode usar qualquer elemento do carregador que funcione melhor para você (
svg
com animação, por exemplo).Você não precisa removê-lo em nenhum método de ciclo de vida. O React substituirá todos os filhos de sua raiz
<div>
pelo seu renderizado<App/>
, como podemos ver no GIF abaixo.Exemplo no CodeSandbox
index.html
index.js
Usando
debugger
para inspecionar a página antes daReactDOM.render()
execução.fonte
Hoje em dia também podemos usar ganchos no React 16.8:
fonte
Definir o tempo limite em componentDidMount funciona, mas no meu aplicativo recebi um aviso de vazamento de memória. Tente algo assim.
fonte
Eu tive que lidar com esse problema recentemente e encontrei uma solução, que funciona muito bem para mim. No entanto, tentei a solução @Ori Drori acima e, infelizmente, não funcionou corretamente (houve alguns atrasos + não gosto do uso de
setTimeout
função).Isto é o que eu vim com:
index.html
Arquivohead
Etiqueta interna - estilos para o indicador:Agora a
body
tag:E então vem uma lógica muito simples, dentro do
app.js
arquivo (na função render):Como isso funciona?
Quando o primeiro componente (no meu aplicativo,
app.js
também na maioria dos casos) é montado corretamente, elespinner
fica oculto com a aplicação dohidden
atributo.O que é mais importante adicionar - a
!spinner.hasAttribute('hidden')
condição evita adicionarhidden
atributo ao girador a cada montagem do componente; portanto, ele será adicionado apenas uma vez, quando o aplicativo inteiro for carregado.fonte
Estou usando o pacote react -progress-2 npm, que é de dependência zero e funciona muito bem no ReactJS.
https://github.com/milworm/react-progress-2
Instalação:
npm install react-progress-2
Inclua react-progress-2 / main.css no seu projeto.
import "node_modules/react-progress-2/main.css";
Inclua
react-progress-2
e coloque-o em algum lugar do componente superior, por exemplo:Agora, sempre que precisar exibir um indicador, basta ligar
Progress.show()
, por exemplo:Observe que as chamadas
show
ehide
são empilhadas; portanto, após as chamadas de apresentação n-consecutivas, você precisa n ocultar as chamadas para ocultar um indicador ou pode usarProgress.hideAll()
.fonte
Também estou usando o React no meu aplicativo. Para pedidos que estou usando axios interceptors, a melhor maneira de fazer a tela do carregador (página inteira, como você mostrou um exemplo) é adicionar classe ou ID ao corpo, por exemplo, dentro dos interceptores (aqui, código da documentação oficial com algum código personalizado):
E, em seguida, basta implementar no CSS seu carregador com pseudoelementos (ou adicionar classe ou ID a um elemento diferente, não o corpo que você quiser) - você pode definir a cor do plano de fundo como opaca ou transparente, etc ... Exemplo:
fonte
Edite o local do arquivo index.html na pasta pública . Copie sua imagem para o mesmo local que index.html na pasta pública. E, em seguida, substitua a parte do conteúdo de index.html contendo
<div id="root"> </div>
tags pelo código html fornecido abaixo.O logotipo agora aparecerá no meio da página durante o processo de carregamento. E será substituído após alguns segundos pelo React.
fonte
Você não precisa de muito esforço, aqui está um exemplo básico.
Você pode brincar
HTML
eCSS
fazer parecer o seu exemplo.fonte
A pergunta mais importante é: o que você quer dizer com 'carregar'? Se você está falando sobre o elemento físico que está sendo montado, algumas das primeiras respostas aqui são ótimas. No entanto, se a primeira coisa que seu aplicativo faz é verificar a autenticação, o que você realmente está carregando são dados do back-end, independentemente de o usuário ter passado por um cookie que os rotula como usuário autorizado ou não autorizado.
Isso se baseia no redux, mas você pode alterá-lo facilmente para o modelo de estado de reação simples.
criador de ação:
A parte final significa que, se o usuário é ou não autorizado, a tela de carregamento desaparece após o recebimento de uma resposta.
Aqui está a aparência de um componente que carrega:
Se state.loading for verdadeiro, sempre veremos uma tela de carregamento. Em componentDidMount, chamamos nossa função getTodos, que é um criador de ações que transforma state.loading em falsy quando obtemos uma resposta (o que pode ser um erro). Nosso componente é atualizado, as chamadas são renderizadas novamente e, desta vez, não há tela de carregamento devido à instrução if.
fonte
O início do aplicativo react é baseado no download do pacote principal. O aplicativo React é iniciado somente após o download do pacote principal no navegador. Isso é verdade mesmo no caso de arquitetura de carregamento lento. Mas o fato é que não podemos indicar exatamente o nome de nenhum pacote. Como o webpack adicionará um valor de hash no final de cada pacote configurável no momento em que você executa o comando 'npm run build'. É claro que podemos evitar isso alterando as configurações de hash, mas isso afetará seriamente o problema de dados em cache no navegador. Os navegadores podem não aceitar a nova versão devido ao mesmo nome de pacote. . precisamos de uma abordagem webpack + js + CSS para lidar com essa situação.
altere public / index.html como abaixo
Na configuração do webpack de produção, altere a opção HtmlWebpackPlugin para abaixo
Pode ser necessário usar o comando 'ejetar' para obter o arquivo de configuração. o webpack mais recente pode ter a opção de configurar o HtmlWebpackPlugin sem ejetar o projeto.
fonte
Também usei a resposta de @Ori Drori e consegui fazê-la funcionar. À medida que o código do React aumenta, os pacotes configuráveis também são compilados para que o navegador do cliente precise fazer o download no primeiro acesso. Isso impõe um problema de experiência do usuário se você não lidar bem com isso.
O que eu adicionei à resposta do @Ori foi adicionar e executar a função onload no atributo index.html on onload da tag body, para que o carregador desapareça depois que tudo estiver totalmente carregado na navegação, veja o trecho abaixo:
fonte
Que tal usar o ritmo
Use este endereço de link aqui.
https://github.hubspot.com/pace/docs/welcome/
1.No site deles, selecione o estilo que deseja e cole em index.css
2.go to cdnjs Copie o link para Pace Js e adicione às tags de script em public / index.html
Detecta automaticamente as cargas da Web e exibe o ritmo na parte superior do navegador.
Você também pode modificar a altura e a animação no css também.
fonte