Stan jest dużą częścią aplikacji reagowania, dlatego Redux jest powszechnie sparowany z nim. Dane często pochodzą z bazy danych, która wymaga żądania i odpowiedzi. W przypadku niektórych zastosowań ten komunikacja może być stała. Może to być trudne, próbując zarządzać wyłącznie w ramach elementów reagujących.
Wprowadza to również nowe problemy - co się stanie, jeśli ładuje się powoli lub nie ładuje się? Każdy komponent dotyczący danych asynchronicznych musiałby zawierać logikę do obsługi tych scenariuszy.
"Thunk" to koncepcja, która może pomóc w tej sytuacji. Każda prośba jest funkcją, która zwraca inną funkcję. Ta funkcja może być następnie wywoływana w późniejszym punkcie, podobnie jak wywołanie zwrotne. Gdybyśmy mogli wysłać tracenie zamiast obiektu akcji, możemy dodać dodatkową logikę w reakcji na inne wydarzenie.
Redux Thunk to biblioteka, która znajduje się pomiędzy wysyłkowymi działaniami a reduktorem. Kiedy widzi wysłanie przeciążenia, przechodzi kilka metod do zwracanej funkcji, która może być użyta do wysyłania dalszych działań, takich jak sukces lub zdarzenie błędu.
W tym samouczku skorzystamy z prośbnych, aby pomóc w ciągnąć danych z serwera, a nie z pliku JSON, współpracując z Photoshare. - Aplikacja komentowania zdjęć zasilana przez Redux.
Mam nowy projekt witryny, ale potrzebujesz, aby pozostać prostym? Oto nasze przewodniki najlepiej Kreator strony internetowej i hosting usługa. Udostępnianie plików z innymi? Weź swój magazyn w chmurze dobrze.
Pobierz pliki. Dla tego samouczka.
Istnieją dwie części do tego projektu - frontową witrynę końcową i tylnym serwerem końcowym działa. Podczas gdy samouczek skupia się na przednim końcu, potrzebujemy uruchomionego serwera, aby pobrać zdjęcia. Pobierz pliki projektu i zainstaluj zależności zarówno dla witryny, jak i serwera. Uruchom serwery dla obu i zostaw ich bieganie w tle.
/ * jeden terminal wewnątrz / witryna * /
& gt; przędza
& gt; początek przędzy.
/ * jeden terminal wewnątrz / serwer * /
& gt; przędza
& gt; początek przędzy
Redux Thunk to Oprogramowanie pośrednie - Funkcjonalność, która siedzi pomiędzy działaniami i redukturami, które mogą zmienić, jak zachowują się te działania. Redux obsługuje wiele zestawów oprogramowania pośredniego, które obejmują całą aplikację. Dostają dodawane, gdy sklep jest tworzony za pomocą komponować metoda. Dodaj oprogramowanie pośrednie do CreateStore. Metoda w index.js.
Importuj {ZastosujMiddleweware, komponuj}
z "Redux";
Import Thunk z "Redux-Thunk";
[...]
Const Store = Createstore (
korzeniec
komponować(
aplikacjaMiddleware (Thunk),
devtools.
)
);
Pierwszą rzeczą, którą musimy teraz załadować, aby załadować zdjęcia do galerii. Podobnie jak regularne działania, potrzebujemy twórców akcji dla różnych stanów, które weźmie asynchroniczne połączenie. Większość będzie miała początek , sukces i błąd działania. Pozwalają Reduxowi wiedzieć, co jest zajęta JavaScript. W ciągu Akcje / zdjęcia / zdjęcia.js , założyć trzy twórcy akcji dla tych różnych stanów.
Eksportuj ConstGalleryStart = () = & GT; ({
Typ: Load_Gallery_start});
Eksportuj Con ConstGallerySuCcess =
Zdjęcia = & gt; ({
Typ: Load_Gallery_Success,
zdjęcia
});
Eksportuj CINSTBallerror = () = & GT; ({
Typ: Load_gallery_error});
Pubyks działają dokładnie tak samo jak twórcy akcji. Nadal wysyłamy wartość zwracania, ale tym razem zwraca funkcję zamiast obiektu. Oprogramowanie pośrednie, które założyliśmy wcześniej, przejdzie metodę wysyłki do zwracanej funkcji. Umożliwia nam to wysłać więcej działań do Redux po początkowej wysyłce. Stwórz loadgaleria. Metoda, która zwraca funkcję. Na razie wysyłaj akcję, aby pokazać, że galeria wciąż ładuje.
Eksportuj ConstGallerie = () = & GT;
wysyłka = & gt; {
wysyłka (loadgalleryStart ());
};
Jesteśmy teraz gotowi do rozpoczęcia pobierania z serwera ustawiamy na początku. Możemy to zrobić za pomocą AXIOS. - Pakiet przeznaczony do pracy z obietnicami w różnych przeglądarkach. Import AXIOS. i złożyć wniosek o zdjęcia loadgaleria. . Jeśli obietnica rozwiązuje, wysyłaj akcję sukcesu, a jeśli nie wysyłaj akcji błędów. Z tym struktura trajem jest kompletna.
Importuj AXIOS z "AXIOS";
[...]
Powrót AXIOS.
.get ("http: // localhost: 3001 / zdjęcia")
.Then (response = & gt; wysyłka (
loadgallerySuccess (response.data)))
.Catch (() = & gt; wysyłka (
loadgallererror ()));
Trosk nie zrobi nic, dopóki nie zostanie wysłane. Możemy to zrobić w ramach komponentu reagowania, jak każde inne działania. Dobry czas, aby rozpocząć ładowanie zdjęć, jest kiedy użytkownik wyświetli główną galerię. Możemy użyć reakcji ComponentDidMount. Metoda cyklu życia jako wyzwalacza, po sprawdzeniu galerii nie jest już ładowana. W ciągu Komponenty / Kontener / Galeria / Galeria.js Wysyłaj A. loadgaleria. działanie, dodając go do MapDispatchToprops. i dzwoniąc do tego wewnątrz ComponentDidMount. .
ComponentDidMount () {
Jeśli (! to.props.propsloaded) {
to.props.loadgallery ();
}
}
Eksportuj Const MapDispatchToprops =
wysyłka = & gt; ({
loadgallery: () = & gt;
wysyłka (loadgallery ()),
});
Kiedy zdjęcia wrócą z serwera, wysyłamy Load_gallery_success. Akcja ze zdjęciami. Musimy dostać to do stanu przez zdjęcia reduktor. Zmierzać do Reduktory / zdjęcia / zdjęcia.js i dodaj skrzynkę do działania sukcesu. Ładunek zawiera wszystkie zdjęcia jako tablica. Po zaktualizowaniu stanu selektor fotograficzny przechodzi zdjęcia do komponentu Galeria, który ma być wyświetlany.
Case Load_Gallery_Success:
Return Action.Photos;
Obecnie zdjęcia nagle pojawiają się po załadowaniu. W wolniejszym połączeniu użytkownik będzie wyglądał na pusty ekran, aż żądanie wykończenia, jeśli kiedykolwiek. Działania wysyłane do ładowania zdjęć można również odebrać w reduktorie UI, aby aktualizować interfejs na bieżąco z tym, co się dzieje. Zaktualizuj flagi załadunku i błędów w reduktorie UI Reduktory / Ui / Ui.js .
Case Load_gallery_Error:
Wróć {... stan,
Ładowanie: false, błąd: true};
Case Load_Gallery_start:
Wróć {... stan,
Ładowanie: true, błąd: false};
Case Load_gallery_Success:
Wróć {... stan,
Ładowanie: false};
Podobnie jak w przypadku zdjęć galerii, potrzebujemy selektorów, aby uzyskać różne wartości UI z Redux. Możemy przekazać je do galerii, która następnie przetwarza różne elementy, jeśli jeden jest prawdziwy. W Selektory / Ui / Ui.js , Dodaj kilka funkcji, aby uzyskać wartości.
Eksportuj Const IsGalleryRrored =
stan = & gt; State.ui.Error;
Eksportuj Const IsGalleryLoading =
stan = & gt; state.ui.loading;
Z gotowymi selektorami można teraz dodać do Galeria Komponent kontenerowy. Dodanie ich tutaj oznacza, że komponent odpowiedzialny za wyświetlanie galerii nie musi wiedzieć o tym, jak dotarły dane. Zmierzać do Pojemnik / Galeria / Galeria.js i dodaj selektory do mapstatetoprops. . Wykonaj stałe dla wartości, aby pomóc wyświetlić stan w następnym kroku.
Const {Błąd, załadunek,
Zdjęcia} = to.props;
[...]
Eksportuj Const MapStatetoprops =
stan = & gt; ({
Błąd: IsgalleryRrored (stan),
Ładowanie: Isgallerydinging (stan),
});
Chociaż mamy rekwizyty błędów i załadunku, obecnie nie ma interfejsu użytkownika, aby wskazać, kiedy są aktywne. Te rekwizyty są wartościami boolowskie, co oznacza, że możemy przełączać wyświetlanie komponentów, gdy są prawdziwe. Zaktualizuj metodę renderowania, aby upewnić się & lt; błąd i gt; i & LT; Loading & GT; Komponenty renderują zamiast galerii w razie potrzeby.
Jeśli (błąd) {
Powrót i błąd / GT ;;
}
Jeśli (załadunek) {
powrót / loading / & gt ;;;
}
Z załadowanym galerią możemy przejść do indywidualnego zdjęcia. Kliknięcie do dowolnego ze zdjęć i odświeżanie strony nie ładuje zdjęcia z powrotem, ponieważ na tej stronie nie ma instrukcji, aby załadować galerię. otwarty Pojemnik / zdjęcie / zdjęcie.js i załaduj galerię ComponentDidMount. jak w. Galeria składnik. The. Photoseed. Sprawdź, czy nie spróbuje ponownie załadować zdjęć, jeśli zostały one już załadowane w galerii.
If (! This.props.propsOloaded) {
to.props.loadgallery ();
}
Użytkownik może kliknąć zdjęcie, gdzie chcą zostawić komentarz. Składnik prezentacyjny uruchomi się Niezależnie od Funkcja Prop, gdy tak się dzieje. W środku Niezależnie od Funkcja, oblicz punkt, w którym użytkownik kliknął na zdjęcie. Serwer wymaga okrągłej wartości procentowej liczby całkowitej, gdy zostanie zapisany.
Const Photo = E.Target
.getBoundingClientRect ();
const top = e.clientx - photo.left;
Const Left = e.Clienty - photo.top;
Const TOPPC = math.round ((Top /
photo.width) * 100);
const leftpc = math.round ((lewy /
photo.height) * 100);
W obliczonym położeniu musimy powiedzieć Redux o komentarzu, dzięki czemu może wyświetlić formularz komentarza. Jest już konfiguracja akcji, aby dodać nowy komentarz na ekranie. Dodaj Niezależnie od w MapDispatchToprops. i zadzwoń do tego po obliczeniu pozycji kliknięcia.
to.props.addNewComment (
TOPPC, LEDPC);
[...]
Eksportuj Const MapDispatchToprops =
wysyłka = & gt; ({
Niezupełnie: (Top, Lewa) = & GT;
wysyłka (bezdech (top, w lewo)),
});
Gdy nowe informacje o komentarzu są przekazywane do Redux, musimy przekazać go do elementu prezentacyjnego. Umożliwia to pokazanie formularza w tej pozycji. Znaleźć getNewComment. selektor, dodaj go mapstatetoprops. i przekazać rekwizyt & lt; foto & gt; .
Eksportuj Const MapStatetoprops =
(stan, rekwizyty) = & gt; ({
NadComment: GetNewNewComment (stan),
});
& lt; foto [...] Newcomment = {
to.props.Newcomment} / & gt;
Kliknięcie na zdjęcie teraz pojawi się nowy formularz komentarza. To jest jego własny podłączony komponent. Po przesłaniu formularza wywołuje a Prześlij komentarz Funkcja Prop i zostaje przekazywana. To jest cicho, które zrobimy. Otworzyć Pojemnik / Nowy / NewComment.js i dodaj tuby do MapDispatchToprops. . Przekazać, że rekwizyty komponentem prezentacyjnym.
Nowy [...]
summment = {summment} / & gt;
Eksportuj Const MapDispatchToprops =
wysyłka = & gt; ({
Przesumowanie: Komentarz = & GT; wysyłka(
Szybkość (komentarz))
});
Trosk, aby dodać nowy komentarz ma podobną strukturę do pobierania galerii, w tym akcję rozpoczęcia, sukcesu i błędów. W tym trudnym jest dodatkowy argument - getstate. funkcjonować. Umożliwia to bezpośredni dostęp do aktualnego stanu w celu uchwycenia danych z niego. Utwórz Prześlij komentarz przecież Działania / nowo Nowy / NewComment.js . Każdy komentarz jest związany ze zdjęciem i użytkownikiem. W tym samouczku identyfikator użytkownika jest trudny do użytkownik reduktor.
Eksportuj Const Summment = Komentarz
= & gt; (wysyłka, getstate) = & gt; {
wysyłka (summmentstart ());
ConstFotoid =.
getcurrentphotoid (getstate ());
Konster User =.
GetCurrenduser (Getstate ());
const {left, top} =
getNewComment (getstate ());
};
Ze wszystkimi niezbędnymi danymi, możemy przesłać komentarz. Axios ma A. Poczta metoda radzenia sobie z POCZTA Wnioski, z drugim argumentem, które będą dane do wysłania tego żądania. Dodaj żądanie do Trosk, przekazując dane w przypadku węża, aby dopasować ten serwer.
Powrót AXIOS
.Poczta(
"http: // localhost: 3001 / komentarze", {
user_id: user.id,
photo_id: currentfotoid,
komentarz,
lewo,
Top
})
Jeśli obietnica z AXIOS rozwiarcza lub odrzuca, musimy opowiedzieć o tym wniosek. Jeśli rozwiązuje się pomyślnie, serwer usiłuje treść komentarza. Powinniśmy przekazać to wraz z działaniem sukcesu. Jeśli zostanie odrzucony, zwolnij akcję błędu. Zaktualizuj obietnicę następnie i złapać Bloki.
.The (({dane: {
ID, komentarz, lewy, górny}}) = & gt;
wysyłka(
Wycinany (
ID, komentarz, w lewo, top,
Użytkownik, CurrentFotoid)
)
)
.Catch (() = & gt; wysyłka (
Układ komory ()));
W tej chwili, gdy komentarz zostanie dodany pomyślnie, zostanie on wyczyszczony z ekranu, ale nie jest widoczny, dopóki strona zostanie odświeżona. Możemy zaktualizować reduktor zdjęć, aby odebrać nowy komentarz i dodać go do swojej tablicy komentarzy, aby wyświetlić jak reszta. Otwórz reduktor / zdjęcia / zdjęcia.js i dodaj obudowę, aby obsługiwać akcję. Utwórz kopię stanu, aby upewnić się, że nie przypadkowo nie zamuścimy istniejącego stanu.
Case Smit_Comment_Success:
Const {ID, Komentarz, Top, Left,
Użytkownik, fotoid} = Action.Payload;
Const NewState = JSON.PARSE (
Json.stringify (stan));
const photo = Newstate.find (
zdjęcie = & gt; photo.id === fotoid);
photo.comments.push ({
ID, komentarz, lewy, górny, użytkownik
});
zwróć Newstate;
Wreszcie, jeśli inny komentarz jest otwarty, a użytkownik chce dodać nowy komentarz, UI jest zbyt zaśmiecone. Powinniśmy ukryć pole komentarza, jeśli zostanie skomponowany nowy komentarz. Możemy zaczepić się do istniejącego Dodaj_new_Comment. działanie, aby oczyścić komentarz. wartość. Zmierzać do Reduktor / Ui / Ui.js i dodaj na to.
Case Add_New_Comment:
powrót {
...stan,
Komentarz: Udefiniowany
};
Ten artykuł został pierwotnie opublikowany w wydaniu 283 Magazynu kreatywnego projektowania stron internetowych Projektant stron internetowych . Kup problem 283 tutaj lub Subskrybuj tutaj projektant stron internetowych .
Powiązane artykuły:
(Kredyt obrazu: Adobe) Pomimo późnego wejścia do gry prototypowania, Adobe XD jest jednym z najlepszych i najszybs..
(Kredyt obrazu: przyszłość) Grava jest systemem zarządzania treścią (CMS) z różnicą. Systemy zarządzania tr..
Ten samouczek nauczy Cię stworzyć animowaną plażę Diorama od początku do końca za pomocą Houdini FX. Zrozumiesz cały prz..
Jako artysta w studio gier zapomniałem najbardziej tradycyjnych mediów, ale atrament zawsze zwraca mnie do mnie. Po dniu wpatry..
Wielu z nas ma teraz jakiś asystent głosowy w domu, czy jest to Echo Amazon Echo, Apple Hompod czy Google Home. Wygląda na to,..
Twoja strona docelowa jest kluczowym elementem Układ strony internetowej. . Jest to pierwsza prawdziwa okazja, kt..
Celem tego utworu było wyprodukować kawałek 3d art. Jest to gotowe przejść prosto z bufora ramki, z niewielk�..
HTML Canvas & GT; Element to potężne rozwiązanie do tworzenia grafiki opartej na pikselach w sieci Javascript. ..