Dies ist ein Beispiel von der Google Adsense-Anwendungsseite. Der Ladebildschirm, der vor der Hauptseite angezeigt wird, wird nach angezeigt.
Ich weiß nicht, wie ich mit React dasselbe machen soll, denn wenn ich einen von der React-Komponente gerenderten Ladebildschirm erstelle, wird dieser beim Laden der Seite nicht angezeigt, da zuvor auf das gerenderte DOM gewartet werden muss.
Aktualisiert :
Ich habe ein Beispiel für meinen Ansatz gemacht, indem ich Screen Loader eingesetzt index.html
und in der React componentDidMount()
Lifecycle-Methode entfernt habe.
Beispiel und React-Loading-Screen .
reactjs
asynchronous
redux
Thanh Nguyen
quelle
quelle
Antworten:
Dies kann durch Platzieren des Ladesymbols in Ihrer HTML-Datei (z. B. index.html) erfolgen, sodass Benutzer das Symbol unmittelbar nach dem Laden der HTML-Datei sehen.
Wenn Ihre App fertig geladen ist, können Sie das Ladesymbol einfach in einem Lifecycle-Hook entfernen. Normalerweise mache ich das in
componentDidMount
.quelle
Das Ziel
Wenn die HTML-Seite gerendert wird, zeigen Sie sofort einen Drehfeld an (während React geladen wird) und blenden Sie ihn aus, nachdem React fertig ist.
Da der Spinner in reinem HTML / CSS (außerhalb der React-Domäne) gerendert wird, sollte React den Ein- / Ausblendungsprozess nicht direkt steuern und die Implementierung sollte für React transparent sein.
Lösung 1 - die: leere Pseudoklasse
Da Sie die Reaktion in einen DOM-Container rendern
<div id="app"></div>
, können Sie diesem Container einen Spinner hinzufügen. Wenn die Reaktion geladen und gerendert wird, verschwindet der Spinner.Sie können kein DOM-Element (z. B. ein div) in die React-Wurzel einfügen, da React den Inhalt des Containers ersetzt, sobald
ReactDOM.render()
es aufgerufen wird. Selbst wenn Sie rendernnull
, wird der Inhalt durch einen Kommentar ersetzt -<!-- react-empty: 1 -->
. Dies bedeutet, dass, wenn Sie den Loader anzeigen möchten, während die Hauptkomponente bereitgestellt wird, Daten geladen werden, aber tatsächlich nichts gerendert wird, ein im Container platziertes Loader-Markup (<div id="app"><div class="loader"></div></div>
zum Beispiel) nicht funktioniert.Eine Abhilfe ist , die Spinner - Klasse die reagieren Behälter, aufzuwerten und die Verwendung
:empty
Pseudo - Klasse . Der Spinner ist sichtbar, solange nichts in den Container gerendert wird (Kommentare zählen nicht). Sobald die Reaktion etwas anderes als einen Kommentar wiedergibt, verschwindet der Lader.Beispiel 1
Im Beispiel sehen Sie eine Komponente, die gerendert wird,
null
bis sie fertig ist. Der Container ist auch der Loader -<div id="app" class="app"></div>
und die Klasse des Loaders funktioniert nur, wenn dies der Fall ist:empty
(siehe Kommentare im Code):Code-Snippet anzeigen
Beispiel 2
Eine Variation der Verwendung der
:empty
Pseudoklasse zum Ein- / Ausblenden eines Selektors besteht darin, den Spinner als Geschwisterelement für den App-Container festzulegen und ihn anzuzeigen, solange der Container mit dem benachbarten Geschwisterkombinator leer ist (+
):Code-Snippet anzeigen
Lösung 2 - Übergeben Sie Spinner "Handler" als Requisiten
Um den Anzeigezustand der Spinner genauer steuern zu können, erstellen Sie zwei Funktionen
showSpinner
undhideSpinner
und übergeben Sie sie über Requisiten an den Root-Container. Die Funktionen können das DOM manipulieren oder alles tun, um den Spinner zu steuern. Auf diese Weise ist sich React weder der "Außenwelt" bewusst, noch muss das DOM direkt gesteuert werden. Sie können die Funktionen zum Testen oder zum Ändern der Logik einfach ersetzen und an andere Komponenten im Reaktionsbaum übergeben.Beispiel 1
Code-Snippet anzeigen
Beispiel 2 - Haken
In diesem Beispiel wird der
useEffect
Spinner nach dem Einhängen der Komponente mithilfe des Hakens ausgeblendet.Code-Snippet anzeigen
quelle
Die Problemumgehung hierfür ist:
Gehen Sie in Ihrer Renderfunktion folgendermaßen vor:
Initialisieren Sie isLoading im Konstruktor als true und in componentDidMount als false
quelle
Wenn Sie nach einer Drop-In-, Zero-Config- und Zero-Dependencies-Bibliothek für den oben genannten Anwendungsfall suchen, versuchen Sie es mit schritt.js ( http://github.hubspot.com/pace/docs/welcome/ ).
Es verbindet sich automatisch mit Ereignissen (Ajax, ReadyState, Verlaufs-Pushstate, JS-Ereignisschleife usw.) und zeigt einen anpassbaren Loader an.
Funktionierte gut mit unseren React / Relay-Projekten (behandelt Navigationsänderungen mit React -Router, Relay-Anfragen) (Nicht verbunden; hatte tempo.js für unsere Projekte verwendet und es hat großartig funktioniert)
quelle
public/index.html
und wählen Sie einen Stil. Das ist ganz einfach, tolles Plugin. Danke.Wenn Ihre React-App sehr umfangreich ist, dauert es wirklich einige Zeit, bis sie nach dem Laden der Seite betriebsbereit ist. Angenommen, Sie mounten Ihren React-Teil der App an
#app
. Normalerweise ist dieses Element in Ihrer index.html einfach ein leeres div:Sie können stattdessen etwas Styling und eine Reihe von Bildern hinzufügen, damit es zwischen dem Laden der Seite und dem ersten Rendern der React-App in DOM besser aussieht:
Nach dem Laden der Seite wird dem Benutzer sofort der ursprüngliche Inhalt von index.html angezeigt. Kurz danach, wenn React bereit ist, die gesamte Hierarchie der gerenderten Komponenten in diesen DOM-Knoten einzubinden, wird dem Benutzer die eigentliche App angezeigt.
Beachten Sie
class
nichtclassName
. Das liegt daran, dass Sie dies in Ihre HTML-Datei einfügen müssen.Wenn Sie SSR verwenden, sind die Dinge weniger kompliziert, da der Benutzer die echte App direkt nach dem Laden der Seite sieht.
quelle
Dies geschieht, bevor
ReactDOM.render()
die Kontrolle über die Wurzel übernommen wird<div>
. Dh Ihre App wurde bis zu diesem Zeitpunkt noch nicht gemountet.So können Sie Ihren Loader in Ihre
index.html
Datei im Stammverzeichnis einfügen<div>
. Und das wird auf dem Bildschirm sichtbar sein, bis React übernimmt.Sie können jedes Loader-Element verwenden, das für Sie am besten geeignet ist (
svg
z. B. mit Animation).Sie müssen es bei keiner Lebenszyklusmethode entfernen. React ersetzt alle Kinder seiner Wurzel
<div>
durch Ihre gerenderten<App/>
, wie wir im GIF unten sehen können.Beispiel für CodeSandbox
index.html
index.js
Verwenden Sie
debugger
diese Option, um die Seite vor dem Ausführen zu überprüfenReactDOM.render()
.quelle
Heutzutage können wir in React 16.8 auch Hooks verwenden:
quelle
Das Festlegen des Zeitlimits in componentDidMount funktioniert, aber in meiner Anwendung wurde eine Warnung zum Speicherverlust angezeigt. Versuchen Sie so etwas.
quelle
Ich musste mich kürzlich mit diesem Problem befassen und fand eine Lösung, die für mich gut funktioniert. Allerdings habe ich oben die @ Ori Drori-Lösung ausprobiert und leider hat sie nicht richtig funktioniert (hatte einige Verzögerungen + Ich mag die Verwendung der
setTimeout
Funktion dort nicht).Folgendes habe ich mir ausgedacht:
index.html
DateiInside
head
Tag - Stile für den Indikator:Nun das
body
Tag:Und dann kommt eine sehr einfache Logik innerhalb der
app.js
Datei (in der Renderfunktion):Wie funktioniert es
Wenn die erste Komponente (in meiner App
app.js
in den meisten Fällen auch) korrekt bereitgestellt wird,spinner
wird sie durch Anwenden eineshidden
Attributs ausgeblendet .Was ist wichtiger hinzuzufügen -
!spinner.hasAttribute('hidden')
Bedingung verhindert, dasshidden
dem Spinner bei jedem Komponenten-Mount ein Attribut hinzugefügt wird, sodass es tatsächlich nur einmal hinzugefügt wird, wenn die gesamte App geladen wird.quelle
Ich verwende das Paket react-progress-2 npm, das keine Abhängigkeit aufweist und in ReactJS hervorragend funktioniert.
https://github.com/milworm/react-progress-2
Installation:
npm install react-progress-2
Fügen Sie Ihrem Projekt react-progress-2 / main.css hinzu.
import "node_modules/react-progress-2/main.css";
Fügen Sie es ein
react-progress-2
und platzieren Sie es irgendwo in der obersten Komponente, zum Beispiel:Wenn Sie jetzt einen Indikator anzeigen müssen, rufen Sie einfach an
Progress.show()
, zum Beispiel:Bitte beachten Sie, dass
show
undhide
Anrufe gestapelt sind. Nach n aufeinanderfolgenden Show-Anrufen müssen Sie n Anrufe ausblenden, um einen Indikator auszublenden, oder Sie können verwendenProgress.hideAll()
.quelle
Ich verwende auch React in meiner App. Für Anfragen, bei denen ich Axios-Interceptors verwende, ist es eine gute Möglichkeit, den Loader-Bildschirm (ganzseitig, wie Sie ein Beispiel gezeigt haben) zu erstellen, Klasse oder ID beispielsweise zum Body innerhalb von Interceptors hinzuzufügen (hier Code aus der offiziellen Dokumentation mit einem benutzerdefinierten Code):
Und dann implementieren Sie einfach in CSS Ihren Loader mit Pseudoelementen (oder fügen Sie Klasse oder ID zu einem anderen Element hinzu, nicht zu einem Körper, wie Sie möchten) - Sie können die Hintergrundfarbe auf undurchsichtig oder transparent usw. einstellen. Beispiel:
quelle
Bearbeiten Sie den Speicherort Ihrer index.html-Datei im öffentlichen Ordner. Kopieren Sie Ihr Bild an denselben Speicherort wie index.html im öffentlichen Ordner. Ersetzen Sie dann den Teil des Inhalts von index.html, der
<div id="root"> </div>
Tags enthält, durch den unten angegebenen HTML-Code.Das Logo wird jetzt während des Ladevorgangs in der Mitte der Seite angezeigt. Und wird dann nach einigen Sekunden durch Reagieren ersetzt.
quelle
Sie brauchen nicht so viel Aufwand, hier ist ein einfaches Beispiel.
Sie können damit herumspielen
HTML
undCSS
dafür sorgen, dass es wie Ihr Beispiel aussieht.quelle
Die wichtigste Frage ist: Was meinst du mit "Laden"? Wenn Sie über das physische Element sprechen, das gemountet wird, sind einige der ersten Antworten hier großartig. Wenn Ihre App jedoch als erstes die Authentifizierung überprüft, laden Sie tatsächlich Daten aus dem Backend, ob der Benutzer ein Cookie übergeben hat, das ihn als autorisierten oder nicht autorisierten Benutzer kennzeichnet.
Dies basiert auf Redux, aber Sie können es leicht in ein einfaches Reaktionszustandsmodell ändern.
Aktionsersteller:
Der letzte Teil bedeutet, ob der Benutzer autorisiert ist oder nicht, der Ladebildschirm verschwindet, nachdem eine Antwort empfangen wurde.
So könnte eine geladene Komponente aussehen:
Wenn state.loading wahr ist, wird immer ein Ladebildschirm angezeigt. Auf componentDidMount rufen wir unsere Funktion getTodos auf, bei der es sich um einen Aktionsersteller handelt, der state.loading fälschlicherweise aktiviert, wenn eine Antwort angezeigt wird (was ein Fehler sein kann). Unsere Komponenten werden aktualisiert, Aufrufe werden erneut gerendert, und dieses Mal wird aufgrund der if-Anweisung kein Ladebildschirm angezeigt.
quelle
Der Start der React-App basiert auf dem Download des Hauptpakets. Die React-App wird erst gestartet, nachdem das Hauptpaket im Browser heruntergeladen wurde. Dies gilt sogar für die Lazy-Loading-Architektur. Tatsache ist jedoch, dass wir den Namen von Bundles nicht genau angeben können. Weil das Webpack am Ende jedes Bundles einen Hashwert hinzufügt, wenn Sie den Befehl 'npm run build' ausführen. Natürlich können wir dies vermeiden, indem wir die Hash-Einstellungen ändern, aber das Cache-Datenproblem im Browser wird ernsthaft beeinträchtigt. Browser können die neue Version aufgrund desselben Bundle-Namens möglicherweise nicht verwenden. . Wir brauchen einen Webpack + js + CSS-Ansatz, um diese Situation zu bewältigen.
Ändern Sie die Datei public / index.html wie folgt
Ändern Sie in Ihrer Produktions-Webpack-Konfiguration die Option HtmlWebpackPlugin wie folgt
Möglicherweise müssen Sie den Befehl 'eject' verwenden, um die Konfigurationsdatei abzurufen. Das neueste Webpack hat möglicherweise die Option, das HtmlWebpackPlugin zu konfigurieren, ohne das Projekt auszuwerfen.
quelle
Ich habe auch die Antwort von @Ori Drori verwendet und es geschafft, sie zum Laufen zu bringen. Wenn Ihr React-Code wächst, werden auch die Bundles kompiliert, die der Client-Browser beim ersten Zugriff herunterladen muss. Dies führt zu einem Problem mit der Benutzererfahrung, wenn Sie nicht gut damit umgehen.
Was ich zu der Antwort von @Ori hinzugefügt habe, war das Hinzufügen und Ausführen der Onload-Funktion im Attribut index.html on onload des Body-Tags, sodass der Loader verschwindet, nachdem alles beim Durchsuchen vollständig geladen wurde. Siehe den folgenden Ausschnitt:
quelle
Was ist mit Pace?
Verwenden Sie diese Linkadresse hier.
https://github.hubspot.com/pace/docs/welcome/
1.Wählen Sie auf ihrer Website den gewünschten Stil aus und fügen Sie ihn in index.css ein
2.go to cdnjs Kopieren Sie den Link für Pace Js und fügen Sie ihn zu Ihren Skript-Tags in public / index.html hinzu
3. Es erkennt automatisch Weblasten und zeigt das Tempo oben im Browser an.
Sie können auch die Höhe und Animation im CSS ändern.
quelle