od Podstaw
7 godz. 6 min · Vue.js · Full-stack i Programowanie
Piotr PalarzWeb DeveloperAby zacząć korzystać z Vue, wystarczy dodać do strony jeden element <script> i zacząć rozszerzać HTML o nowe możliwości prezentacji danych, które w całości kontrolujemy z poziomu kodu JavaScript. Najlepsze jest jednak to, że gdy dane się zmienią, Vue odzwierciedli wszystkie zmiany na stronie. Koniec zatem z odwoływaniem się z poziomu kodu JavaScript do elementów z drzewa DOM i "ręczną" ich manipulacją!Czy łatwość użycia Vue oznacza, że jest to framework prosty i nienadający się do budowania ambitnych aplikacji internetowych? Absolutnie nie! Jeżeli potrafisz korzystać z workflow opartego na webpacku, znasz nową składnię ES6 i chcesz swoje projekty dzielić na wiele uporządkowanych plików - możesz w ten sposób pracować. Jeśli jednak przy innych frameworkach przytłoczyły Cię wszystkie dodatkowe narzędzia i nie potrafiłeś się skupić na najważniejszym, czyli poznawaniu frameworka, to tutaj tego problemu nie doświadczysz.
W kursie tym krok po kroku poznasz ten lekki, acz potężny framework. Zaczniemy od instalcji i obowiązkowego projektu "Hello World!". Dowiesz się czym jest "Virtual DOM" i dlaczego Vue z niego korzysta. Następnie zobaczysz jak kontrolować wybraną część strony internetowej za pomocą metod, właściwości i dynamicznych atrybutów. Aby zrozumieć reaktywność Vue, przyjrzymy się konstrukcjom języka JavaScript, które ją umożliwiają.
Aby aplikacja mogła być interaktywna, nie może być obojętna na działania użytkownika. Z tego powodu zobaczysz, jak przypisywać obsługę zdarzeń, takich jak np. kliknięcie, jak do funkcji przekazywać parametry oraz jak korzystać z natywnego obiektu Event. Nie zabraknie również informacji o tym, jak modyfikować obsługę zdarzeń tak, by np. przechwycić jednoczesne wciśnięcie wybranej kombinacji klawiszy.Jak się przekonasz, dyrektywy Vue pozwolą Ci na manipulację nie tylko zachowaniem, ale i wyglądem elementów HTML. Omówimy dokładnie jak kontrolować przypisywane klasy CSS, a także liniowe style. Wszystko to oczywiście na praktycznych przykładach! Poznasz również sposoby warunkowego wyświetlania elementów, a także iteracji. Już na tym etapie będziesz gotowy do stworzenia swojego pierwszego, praktycznego projektu. Będzie do Counter, a zatem licznik odliczający od 10 do 0. Jeśli kiedykolwiek korzystałeś z biblioteki jQuery, zobaczysz totalnie inne podejście - proste i czytelne.
W jednym z rozdziałów kursu omówimy dokładnie techniki pracy z formularzami. Zobaczysz jak przechwytywać wpisywane przez użytkownika dane, na wszystkich rodzajach pól, jakie oferuje język HTML. Abyś wszystko jak najlepiej zrozumiał, spróbujemy wspólnie zaimplementować tzw. dwukierunkowe wiązanie danych, które Vue oferuje za pomocą jednej dyrektywy.Z kursu dowiesz się także czym są oraz jak tworzyć własne filtry, jak odwoływać się do elementów z drzewa DOM, gdy jest to konieczne, a także co oferują nam własne dyrektywy.
Jedną z największych zalet frameworka Vue.js jest możliwość tworzenia komponentów. Są to własne elementy HTML, które możemy umieszczać w wybranych miejscach naszej aplikacji. Element taki to jednak nie tylko wygląd, który definiujemy za pomocą szablonu, ale także (a może i przede wszystkim) logika, kontrolowana z poziomu kodu JavaScript.Zobaczysz jak zarejestrować własny komponent lokalnie oraz globalnie, jak sprawić, aby był reużywalny, przyjmując różne dane oraz jak komunikować się pomiędzy komponentami, by aplikacja pozostawała w synchronizacji. W tym celu omówimy dwa kierunki komunikacji, najpierw rodzic-dziecko, a później dziecko-rodzic. Na tym etapie wykonamy bardzo ciekawy, praktyczny projekt. Będzie to tabela napędzana danymi. Każdy wiesz tabeli prezentował będzie dane jednej osoby, a kliknięcie ikony kosza pozwoli na jej usunięcie. Ikona edycji zaś, zamieni wiesz w pola input, za pomocą których zaktualizujemy dane. W projekcie tym wykorzystamy niemal całą wcześniej zdobytą wiedzę!
Vue.js oferuje możliwość animowania elementów, kiedy są one pokazywane lub ukrywane. I omówienia tego tematu nie mogło również zabraknąć w tym kursie. Poznasz sposoby na animowanie elementów w użyciem CSS, zobaczysz jak animować podmianę jednego komponentu na drugi, a także jak uzyskać taki efekt dla listy elementów. Mając już wiedzę z zakresu tworzenia własnych komponentów, stworzymy wspólnie element, który pozwoli na animację innych, zawartych w nim elementów. W tym celu zintegrujemy nasz komponent z biblioteką animate.css.
Przez większą część kursu pracować będziemy pisząc kod JavaScript w standardzie ES5, a więc tym najpopularniejszym. Nie będziemy również korzystać z żadnych skomplikowanych narzędzi. Wszystko to po to, abyś mógł jak najlepiej zrozumieć sedno Vue.js, a nie zastanawiać się, który zapis jest specyficzny dla tego frameworka, a który to część nowego standardu JavaScript lub syntactic sugar dodany przez narzędzie uruchamiane z poziomu terminala.Nie oznacza to jednak, że z Vue nie da się pracować w sposób nowoczesny! Oczywiście jest taka możliwość i doskonale się o tym przekonasz. W jednym z rozdziałów kursu omówimy narzędzie vue-cli, które pozwoli nam przygotować startowy projekt nowej aplikacji, a także środowisko skonfigurowane z użyciem webpack'a, które umożliwi nam wydajną pracę. Na tym etapie zobaczysz, że komponentu Vue można tworzyć w zupełnie oddzielnych plikach z rozszerzeniem .vue, gdzie umieścimy zarówno szablon jak i logikę komponentu, a także (opcjonalnie) jego style CSS.Kurs ten zwieńczymy stworzeniem nowoczesnej aplikacji, wykorzystując najnowszy zapis ES6 i workflow stworzony z użyciem vue-cli. Projektem tym będzie Slideshow, a więc galeria zdjęć. Stworzymy od podstaw kilka komponentów, dodamy własny preloader obrazów, a także możliwość pobierania listy obrazów z serwera. Do tego celu wykorzystamy popularną bibliotekę axios, która umożliwia łatwe wykonywanie zapytań HTTP. Pod koniec dodamy do naszej aplikacji również routing, aby na pasku adresu odzwierciedlać aktualnie wyświetlany obraz, a także umożliwić nawigację za pomocą przycisków "Wstecz" i "Do przodu" dostępnych w przeglądarce internetowej. To zadanie ułatwi nam bardzo popularny plugin dla Vue, który nazywa się vue-router. Zobaczysz jak go zainstalować, a także skonfigurować. Następnie omówimy dynamiczne parametry, które odczytamy w komponencie. Finalnie zaktualizujemy adres URL z poziomu kodu JavaScript.Ostatnim krokiem jaki wykonamy, będzie stworzenie builda produkcyjnego naszej aplikacji, który gotowy będzie do na stronę internetową.
Kurs ten jest dla wszystkich osób, które znają już język JavaScript i sposoby na pracę z Obiektowym Modelem Dokumentu. Aby go rozpocząć, nie jest wymagana znajomość innych frameworków, ale taka wiedza na pewno nie zaszkodzi, a pomoże lepiej zrozumieć te zagadnienia, które są dla nich wspólne. Nie jest również wymagana wiedza z zakresu EcmaScript 6 czy webpack'a, lecz na pewno będzie pomocna w ostatim rozdziale tego kursu. Nieważne zatem czy Vue.js będzie pierwszym frameworkiem, który poznasz, czy będzie to odskocznia od React'a czy Angulara - na pewno to narzędzie Cię zaskoczy!
Vue.js 2.5.x
Jest jeszcze jedna bardzo ważna rzecz, którą powinieneś wiedzieć o instancji Vue, a
mianowicie jaki jest jej cykl życia. Mamy coś takiego jak Lifecycle Hooks,
tutaj na stronie Vue.js i będę chciał ci je za moment pokazać. Natomiast najpierw przejdziemy
do Lifecycle Diagram. Tutaj możesz się temu przyjrzeć
na spokojnie, zobaczysz w jaki sposób cała instancja jest stworzona. W
momencie kiedy wywołamy new vue, to jest wywoływana taka akcja init,
tam są przypisywane różne eventy i różne inne rzeczy robi
Vue. To nie jest takie dla nas super istotne. Natomiast ważne jest to, że możemy przypisać
własną funkcję, która nazywa się before create i ona w tym miejscu zostanie
wywołana. Do tej funkcji jak i do każdej innej nie będziemy otrzymywać żadnych
parametrów, ale w niektórych funkcjach będziemy mieli już dostęp do na przykład do data. Zaraz o
tym powiem. Później, kiedy Vue zajmie się już wstawianiem
i reaktywnością, czyli kiedy te dane jak już będą
dostępne, które są w data, kiedy gettery zostaną utworzone, to wywołać
się taki hook, który nazywa się create, również możemy tutaj przypisać własną funkcję. No
i później mamy, jak widzisz, kilka takich decyzji do podjęcia, skoro
już widziałeś w lekcji poprzedniej jak możemy opóźnić wstawianie całej aplikacji
na stronę, nie musi się to dziać od razu, to widzisz, że teraz tutaj ma to sens, czyli pytanie
brzmi czy opcja el została podana tak jak robiliśmy wcześniej. Jeżeli
tak, to sprawdzamy czy template jest
podany. Jeżeli nie to będziemy kompilować kod HTML. Zauważ, że jest
to jest dokładnie to co do tej pory robiliśmy, czyli jeżeli el było podane. Tutaj
odpowiadamy sobie tak, sprawdzamy czy template jest podane, nie, bo nie
jest. Kompilujemy outerHTML, czyli kod tego elementu podanego
tutaj. Jeżeli template były podany to kompilujemy template. Natomiast jeżeli
el nie jest podane, czyli to co mieliśmy na lekcji poprzedniej, to wtedy dopiero kiedy
vm mount zostanie wykonane, czyli to co ci pokazywałem, dopiero
wtedy przejdziemy tego miejsca, więc to nie musi się od razu wykonać. Możemy
się zatrzymać w tym miejscu. No i zauważ, że kiedy
templatka zostanie skompilowana czy to będzie tutaj czy ten kod HTML z drzewa DOM
zostanie skompilowany do szablonu to wykona się event before mount,
czyli przed zamontowaniem tej aplikacji w drzewie DOM również możemy wykonać jakieś
akcje. Następnie poniżej zostanie stworzony
na tym vm el. To jest ten el, który mogliśmy wstawiać kiedy
zrobiliśmy vm mount w poprzedniej lekcji, bez podania elementu. No
i wykona się zdarzenie mounted. W tym miejscu się jakby zatrzymamy
i Vue będzie nasłuchiwało i w momencie kiedy jakieś dane się zmienią, na przykład zmienimy
nasze first name, które mieliśmy w tym miejscu, to Vue wykona taki cykl, czyli
kiedy dane się zmieniają, wykona zdarzenie before update.Następnie dokona
zmian i wykona zdarzenie updated i znowu będzie nasłuchiwać w tym
miejscu. Są natomiast, jak widzisz i jeszcze dodatkowe zdarzenia before destroy
wykonywane przed zniszczeniem takiej instancji. Zaraz ci to pokaże i następnie
destroyed, kiedy instancja jest już zniszczona i ważne, że każdy
z tych kolorowych tutaj boksów, jest to nazwa funkcji jaką możemy przypisać
do naszej instancji i teraz będę chciał ci to pokazać. Wstawiamy to oczywiście
w tym obiekcie konfiguracyjnym. Wstawiłem wszystkie możliwe i jak widzisz mamy
before create, created i tak dalej. No i zrobię jej console.log po to, żebyśmy wiedzieli kiedy
to się wykonuje. Tutaj już nie będziemy opóźniać wczytywania tej aplikacji, ale
gdybyśmy nie podali el, to nie wszystkie z nich się wykonają, tak jak w lekcji poprzedniej
widziałeś, że możemy to zrobić za pomocą vm mount i wtedy
dopiero pewne z nich tak jak mounted czy before mount się wykonają. U nas wykonają
się prawie wszystkie od razu, więc odświeżmy. Widzimy before create,
created before mount i mounted i na razie tyle, czyli dokładnie zatrzymaliśmy
się w tym oto miejscu i nasłuchujemy
na zmianę. Spróbujmy zatem coś zmienić, przejdźmy sobie tutaj i spróbujmy coś
zmienić. Zmienimy tutaj Jan na Janek i zobaczmy
w konsoli, co się nam pojawi. Jak widzisz before update, czyli przed zmianą i po zmianie
i teraz pytanie, po co ci
są te lifecycle hooks, czy często będziesz z tego korzystał. Szczerze mówiąc nie i większość
z nich nie jest jakoś szczególnie potrzebna. Natomiast jeden, który jest ciekawy jest to created
i w tym hook'u masz dostęp już do danych, czyli this i na
przykład tutaj mieliśmy first name last name, to wszystko już tutaj będzie dostępne i co ważne
w tym hook'u możesz na przykład wywołać sobie jakieś zapytanie Ajax, to
będzie również później przydatne w przypadku i komponentów, czyli załóżmy, że ktoś
korzysta z naszego komponentu. Komponenty będą bardzo podobne do tej instancji, która jest tutaj
i chcemy kiedy taki komponent będzie osadzony, żeby wysłać zapytanie
i pobrać jakieś dane. To tutaj w created możesz to zrobić. Oczywiście to będzie asynchroniczne,
więc te dane mogą być dostępne dopiero za chwilkę, kiedy on już jest osadzony na stronie.
Niemniej jednak będziesz tutaj mógł na przykład zrobić this data, czy this items
i tutaj przypisać sobie to, co zwróci ci Ajax, czyli
to jest dobre miejsce, żeby to zrobić. Często również możesz się spotkać z tym, że taki
kod, na przykład wykonywanie zapytań Ajax, jest zrobiony w mounted. Natomiast moim
zdaniem lepiej to zrobić w created, bo mounted jest dopiero wtedy wykonywane kiedy
to wszystko jest już osadzone w drzewie DOM, natomiast czemu by nie wysłać
takiego zapytania troszeczkę wcześniej. Tutaj na etapie created, gdzie wiemy, że mamy
już dostęp do this i wszystkiego co jest w data, w computed czy w
methods. Jeśli natomiast pisałbyś jakąś aplikację,
gdzie chciałbyś jakoś dokładnie wszystko organizować, co się dzieje na stronie, to być może
przydadzą ci się również takie hook'i jak before update, czy updated, żeby sprawdzać
jak dane się zmieniają i tak dalej. Pamiętaj, że te funkcje nie otrzymują żadnych parametrów,
ale możesz się odwołać do instancji poprzez this i wtedy będziesz mógł na przykład before
update, sprawdzić jaka jest wartość powiedzmy first name, a w updated na jaką
wartość się zmieniła. No i zobaczmy sobie jeszcze te dwa hooki, beforeDestroy
i destroyed. Jak można zniszczyć instancję i co to oznacza. Jeżeli
będziemy do niej mieli dostęp, czyli zaznaczmy ją sobie tutaj, vm0, to
można na niej wykonać metodę. Przypominam, że wszystko co jest specyficzne dla Vue, a
nie są to nasze dane takie jak na przykład first name, jest poprzedzone dolarem i ta metoda nazywa
się destroy i można w ten sposób niszczyć instancję. Jeżeli
wcisnę enter, wykona się beforeDestroy i destroyed i zauważ, że nic takiego w
zasadzie się nie stało na stronie. Ale ważne jest to, że instancja Vue już nie istnieje i nie
możemy tutaj już tych danych zmieniać. To znaczy gdybyśmy próbowali je zmienić. Jak
widzisz, nawet się tutaj nie da, ale gdybyśmy nawet próbowali, to nie zostanie odzwierciedlone już
na stronie. Jak widzisz nawet tutaj wyskoczył jakiś błąd kiedy próbowałem
coś tam kliknąć. Ważne jest to, że jeżeli byś sobie zniszczył taką instancję to zmiany,
które na stronie były w drzewie DOM pozostają, ale Vue już nie kontroluje tej
porcji strony, więc to może być przydatne jeżeli wiesz, że powiedzmy twój
komponent, który później będziemy tworzyć doszedł już do takiego momentu, że już w zasadzie nic
więcej od niego nie oczekujesz. Może on miał wyświetlić tylko jakieś dane raz może kilka
razy można było z jakiego przycisku skorzystać i wiesz, że powiedzmy pięciu próbach już
ten komponent nie będzie jakiejś innej akcji oferował. Nie powinien być reaktywny. Może
się tak zdarzyć, to będzie zależało tylko od ciebie. To w zasadzie możesz zniszczyć taką instancje
za pomocą vm destroy i zwolnić pamięć, bo skoro ten komponent nie jest już
potrzebny, to można go w ten sposób zniszczyć. Ważne
jest to, że beforeDestroy i destroyed pozwalają ci na pewne rzeczy. Szczególnie beforeDestroy
na różne czyszczenie. Jeżeli miałbyś jakieś dodatkowe biblioteki
może podłączone do tego wszystkiego lub chciałbyś zamknąć jakieś połączenie, które miałbyś
otwarte, powiedzmy z jakąś bazą danych, warto to zrobić właśnie tutaj w beforeDestroy. To
będzie zależało już od konkretnego przypadku, ja bym chciał żebyś z tej lekcji po prostu zapamiętał,
że mamy taki diagram możesz mu się jeszcze raz przyjrzeć i że możesz zareagować
na różne zdarzenia, które tutaj są i być może w przyszłości wpadniesz
na to że przydałoby ci się na coś zareagować. Wtedy będziesz mógł do tego wrócić, created
to jest to miejsce gdzie być może najczęściej będziesz zaglądał, żeby tutaj coś
wstawić. Tak jak wspomniałem, na przykład, wybrać jakieś dane kiedy montujemy taką aplikację
lub komponent.