Techniki Zaawansowane
5 godz. 11 min · Vue.js · Full-stack i Programowanie
Piotr PalarzWeb DeveloperKurs, który masz przed sobą, to kontynuacja wydanego wcześniej kursu Vue.js od Podstaw. W pierwszym kursie omówione zostały najważniejsze koncepcje pracy z Vue, a w tym materiale poruszamy już bardziej zaawansowane tematy. Przede wszystkim skupimy się na pracy z użyciem nowoczesnego workflow, co da nam niezwykłą swobodę tworzenia aplikacji internetowych. Jeśli zatem znasz już podstawy pracy z tym frameworkiem i chcesz wskoczyć na kolejny poziom wtajemniczenia, ten kurs jest zdecydowanie dla Ciebie. A co znajdziesz w materiale?
Na początku zobaczysz, jak szybko tworzyć pliki startowe do nowej aplikacji z użyciem narzędzia vue-cli. Omówimy możliwość dzielenia kodu na wiele plików, tworzenia szablonów, a także wykorzystywania bezpośrednio funkcji renderującej, do której zamieniane są na etapie builda wszystkie szablony.Zobaczysz również czym są i jak pracować z komponentami funkcyjnymi i tzw. mixinami, które pozwolą reużywać raz napisany fragment kodu.
Przepływ informacji to bardzo ważny temat w każdej aplikacji internetowej. Vue oferuje kilka sposobów na to, aby komponenty mogły się ze sobą komunikować. Ich omówienie zaczniemy od najprostszych technik, które świetnie sprawdzają się w wielu przypadkach. Następnie rozszerzymy możliwości instancji Vue w ten sposób, aby wszystkie komponenty miały dostęp do scentralizowanego miejsca, gdzie przechowywany będzie stan aplikacji.Tam jednak, gdzie aplikacja wymaga zarządzania większą ilością danych jednocześnie, powyższe techniki mogą być niewystarczające. Z tego powodu, podobnie jak w innych frameworkach, Vue posiada oficjalny wzorzec oraz bibliotekę do zarządzania stanem aplikacji. Rozwiązanie to nazywa się VueX i w kursie zostanie ono dokładnie omówione. Zobaczysz zatem jak skonfigurować tzw. store, jak przechowywać w nim dane, jak je wyświetlać w widokach, aktualizować za pomocą tzw. mutacji czy pracować z nimi wykorzystując akcje. Przekonasz się, że początkowa większa ilość pracy, aby wszystko skonfigurować, w pewnym momencie zaczyna się opłacać.
Tworzenie nowoczesnych aplikacji typu SPA (Single Page Application) nie może się obejść bez zmian widoków. Dobrą praktyką jest, aby wraz z takimi zmianami, aktualizowany był również pasek adresu. Wykonanie takiego zadania umożliwiają nam tzw. routery. Vue posiada oficjalny dodatek o nazwie vue-router, który w tym kursie dokładnie omówimy.Zobaczysz jak dołączyć router do swojego projektu, a także jak konfigurować ścieżki. Poruszymy tematy takie jak generowanie odnośników, dynamiczne parametry, tworzenie zagnieżdżonych ścieżek czy nawigacja z poziomu kodu JavaScript. Dowiesz się również, jak tworzyć tzw. guardy, które umożliwią lub zablokują możliwość wyświetlania wybranego widoku, np. w zależności od tego czy użytkownik jest aktualnie zalogowany.
Trzecim, po zarządzaniu stanem aplikacji i wykorzystaniu routingu, komponentem, który niezbędny jest do tworzenia aplikacji napędzanych danymi, jest możliwość wysyłania zapytań HTTP.Tę czynność umożliwi nam bardzo popularna, acz niezależna od Vue biblioteka axios. Zobaczysz jak za jej pomocą pobierać i wysyłać dane. Aby jednak jak najwygodniej pracować z tym rozwiązaniem, połączymy axios z Vue, udostępniając tak naprawdę jej metody wewnątrz każdego komponentu.
W jednym z rozdziałów kursu podejmiemy temat walidacji formularzy. Zobaczysz jak z pomocą popularnego pluginu dla Vue, robić to w bardzo prosty sposób.Omówimy różne funkcje walidujące, które umożliwią sprawdzenie poprawności pól tekstowych, radio czy checkboxów. Zobaczysz jak w łatwy sposób wyświetlać komunikaty o błędach i warunkowo zmieniać wygląd pól. Nie zabraknie również informacji o asynchronicznej walidacji, która pozwoli nam na żywo sprawdzać czy wpisany adres email jest dostępny czy też nie.
Kurs ten oczywiście to nie tylko niezbędna teoria, ale także praktyczne przykłady. Aby jak najlepiej poznać omawiane techniki, wykorzystamy je do stworzenia ciekawych aplikacji.Pierwszą z nich będzie konfigurator produktu, który umożliwi użytkownikowi wybór podzespołów zamawianego komputera. Każdy taki wybór będzie wpływał na końcową cenę, która będzie na bieżąco aktualizowana. Po wybraniu wszystkich opcji, dane prześlemy na serwer. To projekt który pokaże Ci jak przechowywać dane z użyciem VueX, a także jak na ich podstawie wyświetlić widok i napisać logikę.Innym projektem, który wykonamy, będzie Quiz. To aplikacja, gdzie użytkownik odpowiadał będzie na serię pytań pobranych z serwera, a do wyboru będą 3 odpowiedzi. Po przejściu przez wszystkie pytania, wyślemy do serwera zapytanie, a ten w zamian zwróci nam listę poprawnych odpowiedzi. Dzięki temu pokażemy użytkownikowi, gdzie miał rację, a gdzie popełnił błąd. Aplikacja ta wykorzystywać będzie wszystkie najważniejsze techniki, tj. VueX, routing, a także Ajax.
Kurs ten jest dla wszystkich osób, które czują się już swobodnie w pracy z frameworkiem Vue. Jeśli zatem masz już solidną wiedzę podstawową lub przerobiłeś kurs Vue.js od Podstaw, to zdecydowanie jesteś gotów na poszerzenie swoich umiejętnośći w pracy z tym frameworkiem. Co ważne, doświadczenie w pracy z innymi frameworkami JavaScript nie jest tutaj wymagane, a jedyne co będzie bardzo pomocne, to znajomość nowej składni EcmaScript 6.
Vue.js 2.x.x
W tej lekcji pokażę ci w jaki sposób działają mixiny i do czego mogą się one przydać.
Generalnie powiem ci już na początku, że mixina, to może być taki odseparowany fragment logiki, który chciałbyś
w wielu miejscach móc zaaplikować, czyli jeżeli będziesz tworzył komponenty i zauważysz, że pomiędzy nimi
pewne fragmenty logiki są bardzo podobne to, żeby się nie powtarzać będziesz mógł stworzyć mixinę i w mig
schować ją po prostu w te komponenty.
Więc ja tutaj stworzyłem bardzo prosty przykład, ale na nim mam nadzieję, dobrze zrozumiesz w czym rzecz.
Otóż, stworzyłem dwa komponenty user i produkt i stawiam sobie je tutaj do naszej głównej aplikacji.
I teraz jeżeli chodzi o user, wygląda to następująco, mamy jakieś dane użytkownika i tutaj wyświetlamye
jego imię oraz e-mail, jeżeli mamy te dane. Zauważ, że one początkowo mają wartość null.
Po kliknięciu w ten przycisk, chciałbym wykonać metodę getData i ta właśnie metoda getData zasymuluje nam
AJAX, czyli zrobiłem setTimeout, ale normalnie wysłaliśmy np. zapytanie AJAX, pobrali jakieś dane i przepisali je
je do this.user. W momencie kiedy to zrobimy, to oczywiście tutaj nam się to wyświetli, ta templatka sama
w sobie zniknie, to jest tylko taki wrapper i wyświetlą nam się te rzeczy, które są tutaj.
Natomiast jedna rzecz, która jest tutaj ciekawa to w momencie wysyłania takiego zapytania ja będę chciał
ustawić loading na true.
Dzięki temu np. ten przycisk będzie wyłączony i będzie miał klasę loading, co za moment zobaczysz, w momencie
kiedy te dane będą już dostępne, chcę ustawić loading na false, czyli muszę tutaj, po pierwsze, przestawiać
to z true na false, a po drugie mieć to dodane w data i teraz stworzyłem drugi komponent, produkt, on jest
bardzo podobny,
ale to nie ma znaczenia, że jest podobny.
Chodzi mi o to, że tutaj podobieństwo, które nas interesuje, to jest właśnie ten sam fakt, że będziemy ustawiać
jakiś loading na true, na false i musimy to mieć dodane w tym miejscu.
To, że pozostała logika jest podobna, to tylko dlatego, że skopiowałem ten komponent user. Zobaczmy jak to działa.
Klikam wyświetl dane. Loading ma wartość true, więc tak to wygląda przez sekundę.
I tutaj podobnie.
Natomiast te komponenty mogły być zupełnie od siebie różne, ale jedyne co byśmy zaobserwowali, że jest
dla nich wspólne, to fakt, że one potrzebują mieć w data loading i że będą to loading zmieniać na wartość true
i na wartość false.
Jeżeli widzimy, że coś takiego się powtarza, to możemy stworzyć mixinę, która zawrze nam taką logikę.
i teraz ja mixinę sobie utworzę może w nowym katalogu tutaj.
Czyli będę chciał utworzyć nowy plik w katalogu 06.
Następnie src mixins, taki kawałek utworzę i stworzymy sobie tutaj wewnątrz, może plik, który nazwiemy po prostu
mixins.js.
OK, zrobimy to w ten sposób.
I tutaj będę chciał zrobić export const i nazwiemy sobie to loading i będzie to obiekt. Mixina jest obiektem,
który jest niesłychanie podobny do obiektu konfiguracyjnego dla instancji, czy dla tak naprawdę komponentu,
czyli jest to taki obiekt jak tutaj, więc możemy w nim zrobić coś takiego jak data. Musi to być też funkcja,
która będzie nam zwracać ten stan.
Chciałbym żeby tutaj było loading i może mieć na początku wartość false, czyli to co będzie dla nas
wspólne i drugą rzecz którą będziemy chcieli zrobić, to dodać sobie do tej metody, czyli methods i dodamy
metodę toggleLoading.
Tak ją będę chciał nazwać.
I ona po prostu będzie ustawiać this.loading na przeciwną wartość niż ma aktualnie.
Czyli zauważ, że tak dokładnie będzie wyglądać.
Nazwałem mixins i eksportuje tutaj nazwaną stałą po to, żebyśmy mogli tutaj dodać jeszcze inny mixiny.
Tutaj oczywiście znalazłem.
I teraz jeżeli przejdziemy do user, Będziemy mogli wyrzucić loading zupełnie stąd. Tutaj gdzie mieliśmy
loading true, to będziemy mogli skorzystać z this i będziemy mieli toggleLoading.
Na razie to jeszcze nie będzie działać, ale będziemy zaraz taką metodę mieli i tutaj również zrobimy
toggleLoading, więc to powinno nam zadziałać.
Zróbmy to samo tutaj w product.
Natomiast zaraz pokażę jak samą mixinę można użyć, ale już to mamy fajnie odseparowane i samą mixinę
używamy tak, że musimy sobie ją zaimportować, czyli zrobimy import, to był nazywany eksport, więc muszę tutaj podać jego
nazwę.
Czyli będzie to, zobaczymy loading.
Loading from i zobaczmy w jakim jesteśmy katalogu, components, czyli 1 do góry, mixins i mixins.js,
ale js nie musimy podawać na końcu. Czyli to nam powinno zadziałać.
I teraz najważniejsza rzecz, którą musimy zrobić, to tutaj przy naszym komponencie napisać mixins i w tablicy
podajemy mixiny, które nas interesują.
Więc ja tutaj podam po prostu loading, ok. Zróbmy to samo w
product. Też musimy ją zaimportować, żeby po prostu mieć do niej dostęp.
Więc wiem, że może wydaje się, że jest troszeczkę więcej tego zapisu.
Natomiast warto to zrobić, bo jeżeli uda nam się odseparować taką logikę, to nasz kod będzie po prostu
dużo lepszy, a być może będzie tej logiki w niektórych przypadkach zdecydowanie więcej. Ok, więc może
sprawdźmy po prostu czy to zadziała.
I zaraz ci wytłumaczę na czym jeszcze rzecz polega.
Nie mamy żadnych błędów.
Jak widzimy wszystko działa poprawnie i teraz jeżeli chodzi o mixiny, to tak jak ci pokazałem.
One wyglądają podobnie jak komponent, czyli mogą mieć data mogą mieć metody i wszystkie inne rzeczy, które
są w komponentach.
I zauważ, że one są miksowane razem z tym, co mieliśmy tutaj, czyli z tym data zostało to połączone, również w user,
z jego data zostało to połączone. Co jest ważne, gdybyśmy mieli metodę tutaj, która by się nazywała tak samo, to
nasza metoda z komponentu wzięła by tutaj górę, czyli wtedy w toggleLoading, nie byłoby żadnego błędu. ale ona nie
byłaby zaaplikowana.
Natomiast co ciekawe, jeżeli byśmy tutaj skorzystali z hook'ów, czyli np. created.
Wiesz, że mamy taki lifecycle hook console.log Komponent utworzony. Ok. Zobacz, mamy dwa razy komponent utworzony, to gdybyś
na komponencie dodał sobie również taki hook created, to nie będzie tutaj konfliktu, obydwa będą tak naprawdę wyświetlane.
Ale najpierw ten z mixiny, a później ten z twojego komponentu, więc w ten sposób działają mixiny, możesz sobie odseparować
jakiś fragment. No i oczywiście tutaj możesz więcej tych mixin podstawić.
Będzie to również działać poprawnie.
Natomiast jeszcze jedna bardzo ważna rzecz.
Istnieje coś takiego jak globalne mixiny, czyli np. tutaj w naszej głównej aplikacji, gdzie mamy Vue, moglibyśmy
zrobić Vue mixin i stworzyć sobie tutaj taką mixinę. Znowu to jest taki sam obiekt i moglibyśmy tutaj
stworzyć jakąś metodę, która będzie dostępna w każdym komponencie lub np. created,
czyli ten hook, jeszcze sprawdźmy, komponent utworzony, ok. Jak widzisz, znowu nam się to wyświetliło w
taki sam sposób.
Tylko bardzo ważne jest to, że ta mixina teraz do wszystkich komponentów i instancji została zaaplikowana
i generalnie, nie jest zbyt często potrzebne, korzystanie z globalnej mixin, bo ważne jest to że to zostanie
dodane wszędzie.
Natomiast globalny mixin najbardziej przydaje się przy tworzeniu plugin'ów.
Jest to jeszcze bardziej zaawansowany temat, ale wtedy możemy za pomocą plugin'u na każdej instancji, na
każdym komponencie wyeksponować np. jakąś metodę.
Także ja to wykomentuję, ale zostawię to też byś wiedział.
Raczej rzadko korzystam z globalnej mixin.
Zazwyczaj będą to mixyna lokalne, gdzie musimy dokładnie wyraźnie powiedzieć z jakich mixin chcemy
skorzystać.
Tak, więc jeżeli będziesz tworzył aplikacje i zauważysz, że w pewnym miejscu mógłbyś, ale używa jakiś kod,
może miałbyś metodę do pobierania danych AJAX'em i ona by przyjmowała jakiś parametr i kiedy by to pobrało,
to zapisywałoby ci to tutaj wewnątrz np. pod kluczem data. Wyrzuć ją do mixiny i w wielu miejscach możesz
ją wtedy zaimportować.
Jak widzisz w taki prosty sposób ustawić.