Ceci est un exemple de la page d'application Google Adsense. L'écran de chargement affiché avant la page principale s'affichait après.
Je ne sais pas comment faire la même chose avec React car si je rend l'écran de chargement rendu par le composant React, il ne s'affiche pas pendant le chargement de la page car il doit attendre le rendu du DOM avant.
Mise à jour :
J'ai fait un exemple de mon approche en installant le chargeur d'écran index.html
et en le supprimant dans componentDidMount()
la méthode du cycle de vie React .
reactjs
asynchronous
redux
Thanh Nguyen
la source
la source
Réponses:
Cela pourrait être fait en plaçant l'icône de chargement dans votre fichier html (index.html par exemple), de sorte que les utilisateurs voient l'icône immédiatement après le chargement du fichier html.
Lorsque votre application a fini de se charger, vous pouvez simplement supprimer cette icône de chargement dans un hook de cycle de vie, je le fais généralement dans
componentDidMount
.la source
Le but
Lorsque la page html est rendue, affichez immédiatement un spinner (pendant le chargement de React) et masquez-le une fois React prêt.
Puisque le spinner est rendu en HTML / CSS pur (en dehors du domaine React), React ne doit pas contrôler directement le processus d'affichage / masquage, et l'implémentation doit être transparente pour React.
Solution 1 - La pseudo-classe: vide
Puisque vous effectuez le rendu de react dans un conteneur DOM -
<div id="app"></div>
, vous pouvez ajouter un spinner à ce conteneur, et lorsque react se chargera et s'affichera, le spinner disparaîtra.Vous ne pouvez pas ajouter un élément DOM (un div par exemple) dans la racine de réaction, car React remplacera le contenu du conteneur dès qu'il
ReactDOM.render()
sera appelé. Même si vous effectuez un rendunull
, le contenu serait toujours remplacé par un commentaire -<!-- react-empty: 1 -->
. Cela signifie que si vous souhaitez afficher le chargeur pendant le montage du composant principal, les données se chargent, mais que rien n'est réellement rendu, un balisage de chargeur placé à l'intérieur du conteneur (<div id="app"><div class="loader"></div></div>
par exemple) ne fonctionnera pas.Une solution de contournement consiste à ajouter la classe spinner au conteneur de réaction et à utiliser la
:empty
pseudo-classe . Le spinner sera visible tant que rien n'est rendu dans le conteneur (les commentaires ne comptent pas). Dès que react rendra autre chose qu'un commentaire, le chargeur disparaîtra.Exemple 1
Dans l'exemple, vous pouvez voir un composant qui effectue le rendu
null
jusqu'à ce qu'il soit prêt. Le conteneur est également le chargeur -<div id="app" class="app"></div>
et la classe du chargeur ne fonctionnera que si c'est:empty
(voir les commentaires dans le code):Afficher l'extrait de code
Exemple 2
Une variante de l'utilisation de la
:empty
pseudo-classe pour afficher / masquer un sélecteur consiste à définir le spinner en tant qu'élément frère du conteneur d'application et à l'afficher tant que le conteneur est vide à l'aide du combinateur frère adjacent (+
):Afficher l'extrait de code
Solution 2 - Passer les "handlers" de spinner comme accessoires
Pour avoir un contrôle plus fin sur l'état d'affichage des fileurs, créez deux fonctions
showSpinner
ethideSpinner
, et transmettez-les au conteneur racine via des accessoires. Les fonctions peuvent manipuler le DOM, ou faire tout ce qui est nécessaire pour contrôler le spinner. De cette façon, React n'est pas conscient du "monde extérieur", et n'a pas besoin de contrôler directement le DOM. Vous pouvez facilement remplacer les fonctions pour les tests, ou si vous avez besoin de changer la logique, et vous pouvez les transmettre à d'autres composants dans l'arborescence React.Exemple 1
Afficher l'extrait de code
Exemple 2 - crochets
Cet exemple utilise le
useEffect
crochet pour masquer la double flèche après le montage du composant.Afficher l'extrait de code
la source
La solution de contournement pour cela est:
Dans votre fonction de rendu, faites quelque chose comme ceci:
Initialiser isLoading comme true dans le constructeur et false sur componentDidMount
la source
Si vous recherchez une bibliothèque de type drop-in, zero-config et zero-dependencies pour le cas d'utilisation ci-dessus, essayez pace.js ( http://github.hubspot.com/pace/docs/welcome/ ).
Il se connecte automatiquement aux événements (ajax, readyState, pushstate d'historique, boucle d'événements js, etc.) et affiche un chargeur personnalisable.
A bien fonctionné avec nos projets react / relay (gère les changements de navigation à l'aide de react-router, relayer les demandes) (non affilié; avait utilisé pace.js pour nos projets et cela a très bien fonctionné)
la source
public/index.html
et choisissez un style. c'est un plugin très simple et incroyable. Merci.Lorsque votre application React est massive, il faut vraiment du temps pour qu'elle soit opérationnelle après le chargement de la page. Dites, vous montez votre partie React de l'application sur
#app
. Habituellement, cet élément de votre index.html est simplement un div vide:Ce que vous pouvez faire à la place, c'est y mettre un peu de style et un tas d'images pour le rendre meilleur entre le chargement de la page et le rendu initial de l'application React vers DOM:
Une fois la page chargée, l'utilisateur verra immédiatement le contenu original de index.html. Peu de temps après, lorsque React est prêt à monter toute la hiérarchie des composants rendus sur ce nœud DOM, l'utilisateur verra l'application réelle.
Remarque
class
, nonclassName
. C'est parce que vous devez le mettre dans votre fichier html.Si vous utilisez SSR, les choses sont moins compliquées car l'utilisateur verra la vraie application juste après le chargement de la page.
la source
Cela se produira avant de
ReactDOM.render()
prendre le contrôle de la racine<div>
. C'est-à-dire que votre application n'aura pas été montée jusqu'à ce point.Ainsi, vous pouvez ajouter votre chargeur dans votre
index.html
fichier à la racine<div>
. Et cela sera visible à l'écran jusqu'à ce que React prenne le relais.Vous pouvez utiliser tout élément de chargeur qui vous convient le mieux (
svg
avec une animation par exemple).Vous n'avez pas besoin de le supprimer sur aucune méthode de cycle de vie. React remplacera tous les enfants de sa racine
<div>
par votre rendu<App/>
, comme nous pouvons le voir dans le GIF ci-dessous.Exemple sur CodeSandbox
index.html
index.js
Utilisation
debugger
pour inspecter la page avant deReactDOM.render()
s'exécuter.la source
De nos jours, nous pouvons également utiliser des hooks dans React 16.8:
la source
La définition du délai d'expiration dans componentDidMount fonctionne mais dans mon application, j'ai reçu un avertissement de fuite de mémoire. Essayez quelque chose comme ça.
la source
J'ai dû faire face à ce problème récemment et j'ai trouvé une solution, qui fonctionne très bien pour moi. Cependant, j'ai essayé la solution @Ori Drori ci-dessus et malheureusement cela n'a pas fonctionné correctement (il y a eu des retards + je n'aime pas l'utilisation de
setTimeout
fonction là-bas).Voici ce que j'ai proposé:
index.html
fichierhead
Balise intérieure - styles pour l'indicateur:Maintenant le
body
tag:Et puis vient une logique très simple, à l'intérieur du
app.js
fichier (dans la fonction de rendu):Comment ça marche?
Lorsque le premier composant (dans mon application, c'est
app.js
aussi dans la plupart des cas) se monte correctement, lespinner
est masqué avec unhidden
attribut qui lui est appliqué .Ce qui est plus important à ajouter - la
!spinner.hasAttribute('hidden')
condition empêche d'ajouter unhidden
attribut au spinner avec chaque montage de composant, donc en fait, il ne sera ajouté qu'une seule fois, lorsque l'application entière se chargera.la source
J'utilise le package npm react -progress-2 , qui est sans dépendance et fonctionne très bien dans ReactJS.
https://github.com/milworm/react-progress-2
Installation:
npm install react-progress-2
Incluez react-progress-2 / main.css dans votre projet.
import "node_modules/react-progress-2/main.css";
Incluez-le
react-progress-2
et placez-le quelque part dans le composant supérieur, par exemple:Désormais, chaque fois que vous avez besoin d'afficher un indicateur, il vous suffit d'appeler
Progress.show()
, par exemple:Veuillez noter que
show
et leshide
appels sont empilés, donc après n appels consécutifs, vous devez masquer n appels pour masquer un indicateur ou vous pouvez utiliserProgress.hideAll()
.la source
J'utilise également React dans mon application. Pour les demandes que j'utilise des intercepteurs axios, un excellent moyen de créer un écran de chargement (page complète comme vous l'avez montré un exemple) est d'ajouter une classe ou un identifiant, par exemple au corps à l'intérieur des intercepteurs (ici le code de la documentation officielle avec du code personnalisé):
Et puis implémentez simplement en CSS votre chargeur avec des pseudo-éléments (ou ajoutez une classe ou un id à un élément différent, pas au corps comme vous le souhaitez) - vous pouvez définir la couleur de l'arrière-plan sur opaque ou transparent, etc ... Exemple:
la source
Modifiez l'emplacement de votre fichier index.html dans le dossier public . Copiez votre image au même emplacement que index.html dans le dossier public. Et puis remplacez la partie du contenu de index.html contenant les
<div id="root"> </div>
balises par le code html donné ci-dessous.Le logo apparaîtra maintenant au milieu de la page pendant le processus de chargement. Et sera ensuite remplacé au bout de quelques secondes par React.
la source
Vous n'avez pas besoin de beaucoup d'efforts, voici un exemple de base.
Vous pouvez jouer avec
HTML
etCSS
faire ressembler à votre exemple.la source
La question la plus importante est: qu'entendez-vous par «chargement»? Si vous parlez de l'élément physique en cours de montage, certaines des premières réponses ici sont excellentes. Cependant, si la première chose que fait votre application est de vérifier l'authentification, ce que vous chargez réellement, ce sont les données du backend, que l'utilisateur ait transmis un cookie qui les qualifie d'utilisateur autorisé ou non autorisé.
Ceci est basé sur redux, mais vous pouvez facilement le changer en modèle d'état de réaction simple.
créateur d'action:
La dernière partie signifie que l'utilisateur est authentifié ou non, l'écran de chargement disparaît après la réception d'une réponse.
Voici à quoi pourrait ressembler un composant qui le charge:
Si state.loading est véridique, nous verrons toujours un écran de chargement. Sur componentDidMount, nous appelons notre fonction getTodos, qui est un créateur d'action qui rend state.loading faux lorsque nous obtenons une réponse (ce qui peut être une erreur). Notre composant est mis à jour, les appels sont à nouveau rendus, et cette fois, il n'y a pas d'écran de chargement à cause de l'instruction if.
la source
Le démarrage de l'application react est basé sur le téléchargement du bundle principal. L'application React ne démarre qu'après le téléchargement du bundle principal dans le navigateur. Cela est même vrai en cas d'architecture de chargement paresseux. Mais le fait est que nous ne pouvons pas indiquer exactement le nom des bundles. Parce que webpack ajoutera une valeur de hachage à la fin de chaque bundle au moment où vous exécuterez la commande 'npm run build'. Bien sûr, nous pouvons éviter cela en modifiant les paramètres de hachage, mais cela affectera sérieusement le problème des données de cache dans le navigateur. Les navigateurs peuvent ne pas accepter la nouvelle version en raison du même nom de bundle. . nous avons besoin d'une approche webpack + js + CSS pour gérer cette situation.
changez le public / index.html comme ci-dessous
Dans la configuration de votre webpack de production, modifiez l'option HtmlWebpackPlugin ci-dessous
Vous devrez peut-être utiliser la commande «eject» pour obtenir le fichier de configuration. le dernier webpack peut avoir la possibilité de configurer le HtmlWebpackPlugin sans éjecter le projet.
la source
J'ai également utilisé la réponse de @Ori Drori et j'ai réussi à la faire fonctionner. Au fur et à mesure que votre code React grandit, les bundles compilés que le navigateur client devra télécharger lors du premier accès le feront également. Cela pose un problème d'expérience utilisateur si vous ne le gérez pas bien.
Ce que j'ai ajouté à la réponse @Ori était d'ajouter et d'exécuter la fonction onload dans l'attribut index.html onload de la balise body, de sorte que le chargeur disparaisse une fois que tout a été complètement chargé dans la navigation, voir l'extrait ci-dessous:
la source
Qu'en est-il de l'utilisation de Pace
Utilisez cette adresse de lien ici.
https://github.hubspot.com/pace/docs/welcome/
1.Sur leur site Web, sélectionnez le style que vous souhaitez et collez-le dans index.css
2. aller à cdnjs Copiez le lien pour Pace Js et ajoutez à votre script des balises dans public / index.html
3.Il détecte automatiquement les charges Web et affiche le rythme dans le navigateur Top.
Vous pouvez également modifier la hauteur et l'animation dans le css.
la source