Este es un ejemplo de la página de la aplicación Google Adsense. La pantalla de carga mostrada antes de la página principal mostrada después.
No sé cómo hacer lo mismo con React porque si hago que la pantalla de carga sea procesada por el componente React, no se muestra mientras se carga la página porque tiene que esperar a que DOM se procese antes.
Actualizado :
Hice un ejemplo de mi enfoque al poner el cargador de pantalla index.html
y eliminarlo en el componentDidMount()
método React lifecycle.
reactjs
asynchronous
redux
Thanh Nguyen
fuente
fuente
Respuestas:
Esto se puede hacer colocando el ícono de carga en su archivo html (index.html para ej.), De modo que los usuarios vean el ícono inmediatamente después de cargar el archivo html.
Cuando su aplicación termina de cargarse, simplemente puede eliminar ese ícono de carga en un enlace de ciclo de vida, generalmente lo hago en
componentDidMount
.fuente
La meta
Cuando se procese la página html, muestre una rueda giratoria inmediatamente (mientras React carga) y escóndela después de que React esté listo.
Dado que la ruleta se representa en HTML / CSS puro (fuera del dominio React), React no debe controlar el proceso de mostrar / ocultar directamente, y la implementación debe ser transparente para React.
Solución 1 - la: pseudo-clase vacía
Como renderizas reaccionas en un contenedor DOM -
<div id="app"></div>
, puede agregar una ruleta a ese contenedor, y cuando reaccione se cargará y procesará, la ruleta desaparecerá.No puede agregar un elemento DOM (un div por ejemplo) dentro de la raíz de reacción, ya que React reemplazará el contenido del contenedor tan pronto como
ReactDOM.render()
se llame. Incluso si procesanull
, el contenido aún sería reemplazado por un comentario<!-- react-empty: 1 -->
. Esto significa que si desea mostrar el cargador mientras se monta el componente principal, los datos se están cargando, pero en realidad no se muestra nada, se coloca una marca del cargador dentro del contenedor (<div id="app"><div class="loader"></div></div>
por ejemplo) no funcionaría.Una solución alternativa es agregar la clase spinner al contenedor de reacción y usar la
:empty
pseudo clase . La ruleta estará visible, siempre que no se muestre nada en el contenedor (los comentarios no cuentan). Tan pronto como reacciona representa algo más que comentario, el cargador desaparecerá.Ejemplo 1
En el ejemplo, puede ver un componente que se procesa
null
hasta que esté listo. El contenedor también es el cargador<div id="app" class="app"></div>
, y la clase del cargador solo funcionará si es así:empty
(ver comentarios en el código):Mostrar fragmento de código
Ejemplo 2
Una variación sobre el uso de la
:empty
pseudo clase para mostrar / ocultar un selector, es configurar la ruleta como un elemento hermano para el contenedor de la aplicación, y mostrarla siempre que el contenedor esté vacío usando el combinador de hermanos adyacente (+
):Mostrar fragmento de código
Solución 2 - Pase los "controladores" de la ruleta como accesorios
Para tener un control más grano fino sobre el estado de visualización hiladores, crear dos funciones
showSpinner
yhideSpinner
, y pasarlas al contenedor raíz a través de los apoyos. Las funciones pueden manipular el DOM o hacer lo que sea necesario para controlar la ruleta. De esta manera, React no es consciente del "mundo exterior", ni necesita controlar el DOM directamente. Puede reemplazar fácilmente las funciones para la prueba, o si necesita cambiar la lógica, y puede pasarlas a otros componentes en el árbol React.Ejemplo 1
Mostrar fragmento de código
Ejemplo 2 - ganchos
Este ejemplo usa el
useEffect
gancho para ocultar la ruleta después de que se monte el componente.Mostrar fragmento de código
fuente
La solución para esto es:
En su función de render, haga algo como esto:
Inicializar isLoading como verdadero en el constructor y falso en componentDidMount
fuente
Si alguien busca una biblioteca de acceso directo, configuración cero y dependencias cero para el caso de uso anterior, intente pace.js ( http://github.hubspot.com/pace/docs/welcome/ ).
Se conecta automáticamente a eventos (ajax, readyState, historial de estado, bucle de eventos js, etc.) y muestra un cargador personalizable.
Funcionó bien con nuestros proyectos de reacción / retransmisión (maneja los cambios de navegación usando react-router, solicitudes de retransmisión) (No afiliado; había usado pace.js para nuestros proyectos y funcionó muy bien)
fuente
public/index.html
y elija un estilo. Este es un complemento increíblemente simple. gracias.Cuando su aplicación React es masiva, realmente toma tiempo para que se ponga en funcionamiento después de que se haya cargado la página. Digamos que montas tu parte React de la aplicación
#app
. Por lo general, este elemento en su index.html es simplemente un div vacío:Lo que puedes hacer es poner un poco de estilo y un montón de imágenes allí para que se vea mejor entre la carga de la página y el renderizado inicial de la aplicación React a DOM:
Después de cargar la página, el usuario verá inmediatamente el contenido original de index.html. Poco después, cuando React esté listo para montar toda la jerarquía de componentes renderizados en este nodo DOM, el usuario verá la aplicación real.
Nota
class
noclassName
. Es porque necesita poner esto en su archivo html.Si usa SSR, las cosas son menos complicadas porque el usuario realmente verá la aplicación real justo después de que se cargue la página.
fuente
Esto sucederá antes de
ReactDOM.render()
tomar el control de la raíz<div>
. Es decir, su aplicación no se habrá montado hasta ese punto.Para que pueda agregar su cargador en su
index.html
archivo dentro de la raíz<div>
. Y eso será visible en la pantalla hasta que React se haga cargo.Puede usar cualquier elemento del cargador que funcione mejor para usted (
svg
con animación, por ejemplo).No es necesario eliminarlo en ningún método de ciclo de vida. React reemplazará cualquier elemento secundario de su raíz
<div>
con su renderizado<App/>
, como podemos ver en el GIF a continuación.Ejemplo en CodeSandbox
index.html
index.js
Utilizando
debugger
para inspeccionar la página antes deReactDOM.render()
ejecutar.fuente
Hoy en día también podemos usar ganchos en React 16.8:
fuente
Establecer el tiempo de espera en componentDidMount funciona pero en mi aplicación recibí una advertencia de pérdida de memoria. Intenta algo como esto.
fuente
Tuve que lidiar con ese problema recientemente y se me ocurrió una solución, que funciona bien para mí. Sin embargo, probé la solución @Ori Drori anterior y desafortunadamente no funcionó correctamente (tuve algunos retrasos + No me gusta el uso de
setTimeout
función allí).Esto es lo que se me ocurrió:
index.html
expedientehead
Etiqueta interior : estilos para el indicador:Ahora la
body
etiqueta:Y luego viene una lógica muy simple, dentro del
app.js
archivo (en la función de renderizado):Como funciona
Cuando el primer componente (en mi aplicación también lo es
app.js
en la mayoría de los casos) se monta correctamente,spinner
se oculta con la aplicaciónhidden
atributos.Lo que es más importante agregar: la
!spinner.hasAttribute('hidden')
condición impide agregarhidden
atributos al spinner con cada montaje de componentes, por lo que en realidad se agregará solo una vez, cuando se cargue toda la aplicación.fuente
Estoy usando el paquete react-progress-2 npm, que es de dependencia cero y funciona muy bien en ReactJS.
https://github.com/milworm/react-progress-2
Instalación:
npm install react-progress-2
Incluya react-progress-2 / main.css a su proyecto.
import "node_modules/react-progress-2/main.css";
Incluya
react-progress-2
y colóquelo en algún lugar del componente superior, por ejemplo:Ahora, cuando necesite mostrar un indicador, simplemente llame
Progress.show()
, por ejemplo:Tenga en cuenta, que los
show
yhide
las llamadas se apilan, por lo que después-n consecutiva muestran las llamadas, lo que necesita hacer llamadas n Ocultar para ocultar un indicador o puede utilizarProgress.hideAll()
.fuente
También estoy usando React en mi aplicación. Para las solicitudes que estoy usando los interceptores axios, una excelente manera de hacer la pantalla del cargador (página completa como mostraste un ejemplo) es agregar clase o id a, por ejemplo, el cuerpo dentro de los interceptores (aquí el código de la documentación oficial con algún código personalizado):
Y luego simplemente implemente en CSS su cargador con pseudo-elementos (o agregue clase o id a un elemento diferente, no el cuerpo como desee): puede establecer el color de fondo en opaco o transparente, etc. Ejemplo:
fuente
Edite la ubicación de su archivo index.html en la carpeta pública . Copie su imagen en la misma ubicación que index.html en la carpeta pública. Y luego reemplace la parte del contenido de index.html que contiene
<div id="root"> </div>
etiquetas por el siguiente código html dado.El logotipo ahora aparecerá en el medio de la página durante el proceso de carga. Y luego será reemplazado después de unos segundos por React.
fuente
No necesita tanto esfuerzo, aquí hay un ejemplo básico.
Puedes jugar
HTML
yCSS
hacer que se vea como tu ejemplo.fuente
La pregunta más importante es: ¿qué quiere decir con "carga"? Si está hablando del elemento físico que se está montando, algunas de las primeras respuestas aquí son geniales. Sin embargo, si lo primero que hace su aplicación es verificar la autenticación, lo que realmente está cargando son datos del backend si el usuario pasó una cookie que los etiqueta como usuarios autorizados o no autorizados.
Esto se basa en redux, pero puede cambiarlo fácilmente al modelo de estado de reacción simple.
creador de acción:
La parte final significa si el usuario está autenticado o no, la pantalla de carga desaparece después de recibir una respuesta.
Así es como se vería un componente que lo carga:
Si state.loading es verdadero, siempre veremos una pantalla de carga. En componentDidMount, llamamos a nuestra función getTodos, que es un creador de acciones que convierte el estado en carga falsa cuando recibimos una respuesta (que puede ser un error). Nuestras actualizaciones de componentes, las llamadas se procesan nuevamente, y esta vez no hay pantalla de carga debido a la declaración if.
fuente
El inicio de la aplicación Reaccionar se basa en la descarga del paquete principal. La aplicación React solo comienza después de que el paquete principal se descarga en el navegador. Esto es incluso cierto en el caso de la arquitectura de carga diferida. Pero el hecho es que no podemos decir exactamente el nombre de ningún paquete. Debido a que webpack agregará un valor hash al final de cada paquete en el momento en que ejecute el comando 'npm run build'. Por supuesto, podemos evitar eso cambiando la configuración de hash, pero afectará seriamente el problema de los datos de caché en el navegador. Es posible que los navegadores no tomen la nueva versión debido al mismo nombre de paquete. . Necesitamos un enfoque webpack + js + CSS para manejar esta situación.
cambie public / index.html como se muestra a continuación
En la configuración de su paquete web de producción, cambie la opción HtmlWebpackPlugin a continuación
Es posible que necesite usar el comando 'expulsar' para obtener el archivo de configuración. El último paquete web podría tener la opción de configurar HtmlWebpackPlugin sin expulsar el proyecto.
fuente
También utilicé la respuesta de @Ori Drori y logré que funcionara. A medida que crezca su código React, también lo harán los paquetes compilados que el navegador del cliente tendrá que descargar en el acceso por primera vez. Esto impone un problema de experiencia del usuario si no lo manejas bien.
Lo que agregué a @Ori answer fue agregar y ejecutar la función onload en el atributo index.html on onload de la etiqueta del cuerpo, para que el cargador desaparezca después de que todo se haya cargado completamente en la exploración, vea el fragmento a continuación:
fuente
¿Qué hay de usar Pace?
Use esta dirección de enlace aquí.
https://github.hubspot.com/pace/docs/welcome/
1.En su sitio web, seleccione el estilo que desee y péguelo en index.css
2. ir a cdnjs Copie el enlace para Pace Js y agréguelo a sus etiquetas de script en public / index.html
3. Detecta automáticamente cargas web y muestra el ritmo en la parte superior del navegador.
También puede modificar la altura y la animación en el CSS también.
fuente