To jest przykład ze strony aplikacji Google Adsense. Ekran ładowania wyświetlany przed wyświetleniem strony głównej po.
Nie wiem, jak zrobić to samo z Reactem, ponieważ jeśli wykonam ekran ładowania renderowany przez komponent React, nie wyświetla się on podczas ładowania strony, ponieważ musi czekać na renderowanie DOM wcześniej.
Zaktualizowano :
Zrobiłem przykład mojego podejścia, umieszczając program ładujący ekran index.html
i usuwając go w componentDidMount()
metodzie cyklu życia React .
reactjs
asynchronous
redux
Thanh Nguyen
źródło
źródło
Odpowiedzi:
Można to zrobić, umieszczając ikonę ładowania w pliku html (np. Index.html), tak aby użytkownicy widzieli tę ikonę natychmiast po załadowaniu pliku html.
Po zakończeniu ładowania aplikacji możesz po prostu usunąć tę ikonę ładowania w haku cyklu życia, zwykle robię to w
componentDidMount
.źródło
Cel
Kiedy strona html jest renderowana, natychmiast wyświetl spinner (podczas ładowania Reacta) i ukryj go, gdy React będzie gotowy.
Ponieważ spinner jest renderowany w czystym HTML / CSS (poza domeną React), React nie powinien bezpośrednio kontrolować procesu pokazywania / ukrywania, a implementacja powinna być przezroczysta dla Reacta.
Rozwiązanie 1 - pseudoklasa: pusta
Ponieważ renderujesz reaguje na kontener DOM -
<div id="app"></div>
możesz dodać spinner do tego kontenera, a kiedy reakcja się załaduje i wyrenderuje, spinner zniknie.Nie możesz dodać elementu DOM (na przykład elementu div) do elementu React root, ponieważ React zastąpi zawartość kontenera natychmiast po
ReactDOM.render()
wywołaniu. Nawet jeśli wyrenderujesznull
, zawartość i tak zostanie zastąpiona komentarzem -<!-- react-empty: 1 -->
. Oznacza to, że jeśli chcesz wyświetlić moduł ładujący podczas montowania głównego komponentu, dane są ładowane, ale w rzeczywistości nic nie jest renderowane, znacznik modułu ładującego umieszczony wewnątrz kontenera (<div id="app"><div class="loader"></div></div>
na przykład) nie zadziała.Aby obejść ten problem, należy dodać klasę spinner do kontenera reagującego i użyć
:empty
pseudoklasy . Spinner będzie widoczny, o ile nic nie zostanie wyrenderowane w kontenerze (komentarze się nie liczą). Gdy tylko reakcja wyświetli coś innego niż komentarz, moduł ładujący zniknie.Przykład 1
W tym przykładzie widać komponent, który renderuje się,
null
dopóki nie będzie gotowy. Kontener jest również modułem ładującym -<div id="app" class="app"></div>
a klasa modułu ładującego będzie działać tylko wtedy, gdy jest:empty
(zobacz komentarze w kodzie):Pokaż fragment kodu
Przykład 2
Odmianą użycia
:empty
pseudoklasy do pokazania / ukrycia selektora jest ustawienie pokrętła jako elementu siostrzanego w kontenerze aplikacji i pokazanie go, dopóki kontener jest pusty, przy użyciu sąsiedniego łącznika siostrzanego (+
):Pokaż fragment kodu
Rozwiązanie 2 - Podaj "handlerów" spinnerów jako rekwizyty
Aby mieć bardziej szczegółową kontrolę nad stanem wyświetlania przędzarek, utwórz dwie funkcje
showSpinner
ihideSpinner
i przekaż je do kontenera głównego za pomocą rekwizytów. Funkcje mogą manipulować DOM lub robić wszystko, co potrzebne, aby sterować przędzarką. W ten sposób React nie jest świadomy „świata zewnętrznego” ani nie musi bezpośrednio kontrolować DOM. Możesz łatwo zamienić funkcje do testowania lub jeśli potrzebujesz zmienić logikę, i możesz przekazać je innym komponentom w drzewie React.Przykład 1
Pokaż fragment kodu
Przykład 2 - haki
W tym przykładzie zastosowano
useEffect
haczyk do ukrycia kołpaka po zamontowaniu komponentu.Pokaż fragment kodu
źródło
Sposób obejścia tego problemu:
W swojej funkcji renderującej zrób coś takiego:
Zainicjuj isLoading jako true w konstruktorze i false na componentDidMount
źródło
Jeśli ktoś szuka biblioteki typu drop-in, zero-config i zero-dependencies dla powyższego przypadku użycia, wypróbuj pace.js ( http://github.hubspot.com/pace/docs/welcome/ ).
Automatycznie podłącza się do zdarzeń (ajax, readyState, historia pushstate, pętla zdarzeń js itp.) I pokazuje konfigurowalny program ładujący.
Działał dobrze z naszymi projektami reagowania / przekazywania (obsługuje zmiany nawigacji za pomocą routera reagowania, żądań przekaźników) (nie jest powiązany; używał pace.js w naszych projektach i działał świetnie)
źródło
public/index.html
i wybrać styl. to jest martwa prosta, niesamowita wtyczka. Dziękuję Ci.Kiedy Twoja aplikacja React jest ogromna, jej uruchomienie i uruchomienie po załadowaniu strony zajmuje naprawdę dużo czasu. Powiedzmy, że montujesz część React aplikacji do
#app
. Zwykle ten element w pliku index.html to po prostu pusty element div:Zamiast tego możesz umieścić trochę stylizacji i kilka obrazów, aby wyglądało lepiej między załadowaniem strony a początkowym renderowaniem aplikacji React do DOM:
Po załadowaniu strony użytkownik natychmiast zobaczy oryginalną zawartość index.html. Wkrótce, gdy React będzie gotowy do zamontowania całej hierarchii renderowanych komponentów do tego węzła DOM, użytkownik zobaczy rzeczywistą aplikację.
Uwaga
class
, nieclassName
. To dlatego, że musisz umieścić to w swoim pliku html.Jeśli używasz SSR, sprawy są mniej skomplikowane, ponieważ użytkownik faktycznie zobaczy prawdziwą aplikację zaraz po załadowaniu strony.
źródło
Stanie się to zanim
ReactDOM.render()
przejmie kontrolę nad rootem<div>
. Oznacza to, że Twoja aplikacja nie została zainstalowana do tego momentu.Możesz więc dodać program ładujący do
index.html
pliku w katalogu głównym<div>
. Będzie to widoczne na ekranie, dopóki React nie przejmie władzy.Możesz użyć dowolnego elementu programu ładującego, który najlepiej Ci odpowiada (
svg
na przykład z animacją).Nie musisz go usuwać w żadnej metodzie cyklu życia. React zastąpi wszystkie elementy podrzędne swojego roota
<div>
renderowanym<App/>
, jak widać na poniższym GIF-ie.Przykład na CodeSandbox
index.html
index.js
Służy
debugger
do sprawdzania strony przedReactDOM.render()
uruchomieniem.źródło
Obecnie w React 16.8 możemy używać hooków:
źródło
Ustawienie limitu czasu w componentDidMount działa, ale w mojej aplikacji otrzymałem ostrzeżenie o wycieku pamięci. Spróbuj czegoś takiego.
źródło
Niedawno musiałem uporać się z tym problemem i znalazłem rozwiązanie, które dla mnie działa dobrze. Jednak próbowałem powyżej rozwiązania @Ori Drori i niestety nie działało to dobrze (miało pewne opóźnienia + nie podoba mi się użycie
setTimeout
tam funkcji).Oto, co wymyśliłem:
index.html
plikhead
Tag wewnętrzny - style wskaźnika:Teraz ten
body
tag:Następnie pojawia się bardzo prosta logika, wewnątrz
app.js
pliku (w funkcji renderowania):Jak to działa?
Kiedy pierwszy komponent (w mojej aplikacji jest tak samo
app.js
w większości przypadków) zamontowany poprawnie,spinner
jest on ukrywany z zastosowaniemhidden
do niego atrybutu.Co ważniejsze do dodania -
!spinner.hasAttribute('hidden')
warunek zapobiega dodawaniuhidden
atrybutu do błystki przy każdym montażu komponentu, więc w rzeczywistości zostanie dodany tylko raz, gdy cała aplikacja się załaduje.źródło
Używam React-Progress-2 pakietu NPM React , który jest zależny od zera i działa świetnie w ReactJS.
https://github.com/milworm/react-progress-2
Instalacja:
npm install react-progress-2
Dołącz do swojego projektu react-progress-2 / main.css.
import "node_modules/react-progress-2/main.css";
Uwzględnij
react-progress-2
i umieść gdzieś w górnym komponencie, na przykład:Teraz, gdy chcesz pokazać wskaźnik, po prostu zadzwoń
Progress.show()
, na przykład:Zwróć uwagę, że
show
ihide
wywołania są ułożone w stos, więc po n-kolejnych wywołaniach show, musisz wykonać n hide wywołań, aby ukryć wskaźnik lub możesz użyćProgress.hideAll()
.źródło
Używam również Reacta w mojej aplikacji. W przypadku żądań używam przechwytywaczy axios, więc świetnym sposobem na utworzenie ekranu modułu ładującego (na całej stronie, jak pokazano na przykładzie) jest dodanie klasy lub identyfikatora do na przykład body inside przechwytywacze (tutaj kod z oficjalnej dokumentacji z niestandardowym kodem):
A potem po prostu zaimplementuj w CSS swój moduł ładujący z pseudoelementami (lub dodaj klasę lub identyfikator do innego elementu, a nie body, jak chcesz) - możesz ustawić kolor tła na nieprzezroczysty lub przezroczysty, itp ... Przykład:
źródło
Edytuj lokalizację pliku index.html w folderze publicznym . Skopiuj obraz do tej samej lokalizacji co plik index.html w folderze publicznym. A następnie zamień część zawartości index.html zawierającą
<div id="root"> </div>
tagi na poniższy kod html.Logo będzie się teraz pojawiać na środku strony podczas procesu ładowania. Po kilku sekundach zostanie zastąpiony przez React.
źródło
Nie potrzebujesz tyle wysiłku, oto podstawowy przykład.
Możesz bawić się
HTML
iCSS
sprawić, by wyglądał jak twój przykład.źródło
Najważniejsze pytanie brzmi: co rozumiesz przez „ładowanie”? Jeśli mówisz o montowanym elemencie fizycznym, niektóre z pierwszych odpowiedzi są świetne. Jeśli jednak pierwsza rzecz, jaką wykonuje aplikacja, to sprawdzenie uwierzytelnienia, tak naprawdę ładujesz dane z zaplecza, czy użytkownik przekazał plik cookie oznaczający go jako autoryzowanego lub nieautoryzowanego użytkownika.
Opiera się to na reduksie, ale można go łatwo zmienić na zwykły model stanu reakcji.
twórca akcji:
Ostatnia część oznacza, czy użytkownik jest autoryzowany, czy nie, ekran ładowania znika po otrzymaniu odpowiedzi.
Oto jak mógłby wyglądać komponent, który go ładuje:
Jeśli state.loading jest prawdą, zawsze zobaczymy ekran ładowania. Na componentDidMount wywołujemy naszą funkcję getTodos, która jest twórcą akcji, która zmienia stan. Ładowanie fałszywie, gdy otrzymamy odpowiedź (co może być błędem). Nasz komponent aktualizuje się, wywołania renderują się ponownie i tym razem nie ma ekranu ładowania z powodu instrukcji if.
źródło
Uruchomienie aplikacji React opiera się na pobraniu głównego pakietu. Aplikacja React uruchamia się dopiero po pobraniu głównego pakietu w przeglądarce. Dzieje się tak nawet w przypadku leniwej architektury ładowania. Ale faktem jest, że nie możemy dokładnie określić nazwy żadnego pakietu. Ponieważ pakiet webpack doda wartość skrótu na końcu każdego pakietu w momencie uruchomienia polecenia „npm run build”. Oczywiście możemy tego uniknąć, zmieniając ustawienia skrótu, ale poważnie wpłynie to na problem z danymi pamięci podręcznej w przeglądarce. Przeglądarki mogą nie przyjąć nowej wersji z powodu tej samej nazwy pakietu. . potrzebujemy podejścia webpack + js + CSS, aby poradzić sobie z tą sytuacją.
zmień plik public / index.html jak poniżej
W konfiguracji paczki produkcyjnej zmień opcję HtmlWebpackPlugin na poniżej
Może być konieczne użycie polecenia „eject”, aby pobrać plik konfiguracyjny. Najnowszy pakiet internetowy może mieć opcję konfiguracji HtmlWebpackPlugin bez wysuwania projektu.
źródło
Użyłem również odpowiedzi @Ori Drori i udało mi się to uruchomić. Wraz z rozrastaniem się kodu Reacta, skompilowane pakiety będą musiały być pobierane przez przeglądarkę klienta przy pierwszym dostępie. Powoduje to problem z wygodą użytkownika, jeśli nie poradzisz sobie z tym dobrze.
To, co dodałem do odpowiedzi @Ori, to dodanie i wykonanie funkcji onload w index.html atrybucie onload tagu body, aby moduł ładujący zniknął po całkowitym załadowaniu wszystkiego w przeglądarce, zobacz poniższy fragment:
źródło
A co z używaniem Pace
Użyj tego adresu łącza tutaj.
https://github.hubspot.com/pace/docs/welcome/
1. Na ich stronie internetowej wybierz żądany styl i wklej w index.css
2. przejdź do cdnjs Skopiuj link do Pace Js i dodaj do swoich skryptów tagi w public / index.html
3. Automatycznie wykrywa obciążenia internetowe i wyświetla tempo na górze przeglądarki.
Możesz także zmienić wysokość i animację w css.
źródło