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ą i czym są komponenty funkcyjne. Z angielskiego byśmy powiedzieli
functional components.
Stworzyłem taki oto przykład, zobacz tutaj,
App importuje sobie HeadingGroup, tutaj jest compononets i mówię, że chcę używać tej templatki w App tego komponentu i używam
go w następujący sposób, podając mu prop heading z tekstem HelloWorld i z subheading z tekstem Witaj Świecie!
Czyli chciałem stworzyć nieużywany komponent, który pozwoli mi na to, abyśmy mogli taką grupę nagłówków
gdzieś sobie wstawiać.
I to oczywiście mogłoby być ładnie ostylowane i wielokrotnie byśmy z tego mogli korzystać.
I teraz jak wygląda sam komponent on ma prostą templatkę, gdzie wstawimy heading i subheading właśnie w
taki sposób.
No i jakieś proste style, dołączone byłyby również do tego komponentu, ale żeby to mogło działać, to musimy
przyjmować sobie props heading oraz sam heading, które są przekazywane właśnie z tego miejsca i zobaczmy jak
to wszystko działa.
Jak widzisz, bez problemu.
Natomiast co jest ważne, to ten komponent jest stworzony jak każdy inny, czyli on ma instancje, a co to znaczy,
że ma instancje.
Powiedzmy, że jest jakby utworzony z użyciem new Vue,
czyli gdybyśmy tutaj dodali jakieś metody, to w nich mielibyśmy dostęp do this, this oznacza, że mamy tutaj
jakąś instancję.
Jeżeli natomiast tworzymy komponent, który nie posiada własnego stanu, czyli zauważ tutaj nigdzie nie
ma data, nie potrzebujemy w żaden sposób tym manipulować.
Zauważ, że ten komponent również nie ma żadnych zdarzeń, takich jak np. kliknięcie, ale jest on tak naprawdę
czysto prezentacyjny i takie komponenty również przecież często się zdarzają, to możemy oznaczyć ten komponent
jako functional.
Jeśli tutaj wpiszemy functional true,
to oznacza, że on będzie traktowany bardziej jako funkcja, która otrzyma pewne parametry.
My te parametry będziemy mogli wstawić do templatki i zwrócić gotowy kod.
Więc jeżeli komponent będzie taki funkcyjny, to oznacza, że nie będzie tworzona cała jego instancja, nie
będziemy mieli tutaj data i nie będzie dostępu do this.
Ale dzięki temu on będzie działał dużo szybciej.
Czyli gdybyśmy mieli wiele takich komponentów, typowo prezentacyjnych, to uważam, że jak najbardziej powinniśmy
zapisywać je jako komponenty funkcjonalne. Tylko teraz nam się pojawi błąd, zauważ, bo jeżeli oznaczymy komponent
jako funkcyjny, to tutaj Vue oczekuje, że my nie będziemy tutaj mieli templatki w takiej formie, ale że będziemy
mieli funkcję renderującą. Nie do końca jest to prawdą, bo zaraz pokażę ci jak to rozwiązać.
Ale wracając jeszcze do funkcji renderującej, jakbyśmy mogli sobie z tym poradzić, wiemy że pod pierwszym
parametrem, który możemy nazwać h, będziemy mieli createElement i co ważne, tutaj już wewnątrz tej funkcji
nie będziemy mieli dostępu do this np. this i mielibyśmy heading.
To jest bardzo ważne,
tylko tutaj otrzymamy drugi parametr i będzie to kontekst i pokaże ci teraz jakbyśmy mogli znowu sobie
zrobić to samo, co mieliśmy w tym miejscu.
Pamiętasz, pokazywałem już wcześniej, że możemy z tej funkcji h zwrócić sobie div, a jego dzieci, to będą kolejne
elementy.
I tutaj mielibyśmy h1.
I co ważne, tekst tego elementu to już nie będzie this i następnie heading, tylko musielibyśmy się tutaj
odwołać do context.props.heading.
W ten oto sposób i kolejne dziecko, które byśmy tutaj utworzyli, to byłby paragraf i mielibyśmy context.
Następnie props i następnie subheading.
Oprócz props,
tutaj w tym kontekście, mamy jeszcze wiele wiele innych rzeczy. Warto sobie do tego zajrzeć również na
stronie dokumentacji,
gdyby to ci było potrzebne, ale sprawdźmy czy to w ogóle zadziała.
W zasadzie mogę nawet całkowicie usunąć.
Sprawdźmy.
Jak widzisz, działa nam to poprawnie, ale wcale nie musimy, jeżeli nie jest to nam potrzebne, tworzyć w ten
sposób funkcji renderującej.
Ja ją teraz stąd usunę i pokażę ci jak można sprawić, żeby to wszystko zaczęło działać poprawnie.
Zanim to jednak zrobię, powiem ci jeszcze tyle, że od jakiegoś czasu również tutaj props nie musimy podawać,
wszystko, co zostanie w tym miejscu podane, zostanie automatycznie zamienione na props'y, jeżeli tworzymy komponent
funkcyjny.
Więc, w zasadzie zobaczmy, czy to będzie działać.
Komentuje to, jak widzisz działa tak samo, czyli te props'y nie są nam potrzebne, ale wyrzucę również te
funkcje i odkomentuje to, co było w tym miejscu, to wyrenderuje znowu błąd, ale okazuje się, że wystarczy
tutaj do templatki dodać parametr, taki argument functional, ok i teraz prawie nam to już będzie działać. Tutaj
functional nie musi być podane. OK.
Jeszcze nie działa, ale w tym miejscu musimy napisać props, czyli to co mieliśmy na tym obiekcie context, to tak
jakby on tutaj jest wstawiony.
Jeżeli napiszę props, powinno to zacząć działać.
Jak zatem widzisz, jeżeli będziesz chciał stworzyć komponent, który będzie bardziej wydajny, bo on nie
ma własnego stanu i nie ma tutaj jakichś skomplikowanych rzeczy, to wystarczy, że będziesz tworzył taki
prosty komponent, gdzie podasz, po prostu, functional. W zasadzie to wszystko, co jest w tym miejscu.
Sprawdźmy czy gdybyśmy to usunęli, to czy nam ten komponent nadal działał.
Okazuje się, że tak, czyli aby stworzyć komponent funkcyjny, wystarczy podać jego templatkę, oznaczyć ją
jako functional i wewnątrz korzystać z props i to wszystko będzie jak najbardziej działać poprawnie
i będzie bardzo, bardzo, bardzo szybko również renderowane.
Oczywiście Vue loader, to wszystko skomplikuje sobie do poprawnego zapisu, gdzie pojawi się to functional true i funkcja renderująca
w ten sposób zostanie utworzona z takiej oto templatki.