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
Z wiedzą, którą już masz, czas na mini praktyczny projekt. Proszę
pisz go razem ze mną, nie będzie on skomplikowany, ale przećwiczymy sobie rzeczy, które
były do tej pory. Chcemy stworzyć Counter, który będzie pozwalał
na kliknięcie przycisku START, będzie wtedy blokował ten przycisk, ukrywał
również tą wiadomość, a tutaj od dziesięciu odliczał do zera i kiedy zakończy pokażę
tę wiadomość i odblokuje przycisk i ustawi wartość powrotem na 10. Kilka
rzeczy do zrobienia, już co nieco zacząłem, czyli po pierwsze ma wiadomość,
po drugie mam ten counter, który się tutaj wyświetla. No i oczywiście musiałem to
dodać do data. Natomiast nie mamy nic więcej. Będę chciał
zrobić tutaj kilka rzeczy. Po pierwsze będziemy musieli skorzystać
ze zdarzeń. Po kliknięciu na ten przycisk będziemy chcieli rozpocząć odliczanie,
więc zrobimy sobie click. Przypominam ci jeszcze, jeżeli
już o tym zapomniałeś, że można zrobić to w ten sposób. Nie mniej jednak wydaje
mi się, że taki zapis jest dużo czytelniejszy. Będę chciał wykonać metody start kiedy
klikniemy na ten przycisk, dlatego dodajmy sobie teraz taką metodę. Jeżeli
jesteś zaznajomiony ES6, to również możesz tutaj pisać skrótowo w ten sposób,
to nie ma nic wspólnego z samym Vue, ale w EcmaScript6 w obiektach można w ten sposób
dać funkcję. Natomiast ja troszeczkę jestem przewrażliwiony
na tym punkcie, że jeżeli wiem iż ten kod bezpośrednio trafia do przeglądarki, to
wtedy może ta przeglądarka nie wspiera ES6, w naszym kursie nie ma z tym problemu, Chrome
bardzo dobrze to wspiera. Niemniej jednak zostawmy sobie to na razie w takim ES5
zapisie i teraz pytanie, co będzie jeżeli klikniemy start. Będę
chciał pierwsze, ustawić sobie inProgress na
true, więc musimy sobie tutaj coś takiego dodać, to nam będzie określało czy
odliczanie trwa, więc na początek będzie miało wartość false. Kiedy
mamy już coś takiego, to nam pozwoli już kontrolować przycisk czyli chciałbym, żeby
on był wyłączony. Jeżeli in progres ma
wartość true, więc zauważ, że teraz jest włączony. Jeżeli
inProgress tutaj zmienimy, jak widzisz w tym
narzędziu jeżeli mamy wartości boolean true lub false to możemy takim checkbox'em to zmieniać. Na
stronie oczywiście jest to odzwierciedlane, więc to nam już będzie działać. Oczywiście
po kliknięciu w ten przycisk dokładnie tak samo. Z tą wiadomością zrobimy rzecz podobną.
Za pomocą znanej ci już dyrektywy v-if, czyli ja
po prostu chcę ją stąd wyrzucić na początku, a w zasadzie
kiedy dopiero klikniemy w element, czyli możemy tutaj zrobić not
in progress i ona
wtedy będzie widoczna, ale w tym konkretnym przypadku lepiej będzie skorzystać może
z v-show, bo skoro ona na samym początku i tak jest widoczna, to potem
tylko możemy ją ukrywać i pokazywać i zauważ, że z punktu widzenia optymalizacji będzie
to działać szybciej. Ona od początku i tak ma być wstawiona do drzewa DOM, więc jeżeli
rozpoczynamy odliczanie w zasadzie nie ma potrzeby, żeby ją usuwać całkowicie,
a potem wstawić okno. Wystarczy, że ją ukryjemy, więc v-show tutaj sprawdzi się świetnie.
Po kliknięciu, jak widzisz, działa to poprawnie. No i teraz pozostało nam
stworzyć logikę odliczania, więc ja chciałbym to zrobić w ten sposób, że tutaj
w tej funkcji start ustawimy in progress na true i dodatkowo wykonamy
metodę countdown, czyli odliczaj i oczywiście
całą logikę mógłbym zapisać tutaj w tym start, ale wolę sobie to podzielić i zrobimy
to w osobnej metodzie countdown. No
i tutaj będziemy musieli skorzystać z settimeout oczywiście, żeby to wszystko działało
poprawnie. Tu już nie będzie jakiegoś kodu specyficznego dla Vue. Po
pierwsze będę chciał odejmować wartość counter, czyli minus minus, za każdym razem kiedy countdown
się wykona. Teraz będziemy chcieli sprawdzić czy this counter
jest większa od zera. Jeżeli jest większa od zera, to chcę ustawić timeout
set timeout i tutaj musimy
powiedzieć jaką funkcję chcemy wykonać. No więc ja będę chciał wykonać raz jeszcze countdown,
nie wywołuje jej tutaj pamiętaj, tylko
przekazuje ją przez referencje i mówię po jakim czasie, czyli po sekundzie chcę ją wykonać
od nowa, czyli już sobie to prześledźmy. Klikamy na przycisk wywołuje
się countdown, zmniejszam wartość z 10 do 9. Sprawdzamy
czy jest większa od zera, jest i mówimy, że za sekundę wykonaj znowu countdown,
po sekundzie co się wydarzy. Wykona się ta funkcja
od nowa. Zmiejszy wartość do 8, znowu to sprawdzi i znowu się ustawi. Kiedy
zjedziemy z wartością do zera, tutaj to ten settimeout już się nie ustawi
i wtedy tak naprawdę to odliczanie się zakończy, ale będziemy
to mogli przechwycić w bloku else, czyli w bloku else możemy
napisać this counter i zresetować go na wartość 10, czyli wartość początkową
i in progress ustawimy zawartość false. To sprawi, że przycisk
się odblokuje, a ten komunikat się powinien pojawić. Sprawdźmy
czy to zadziała. Jak widzimy odliczanie trwa. Tutaj
jeszcze jeden mały problem, który za moment rozwiążemy, ok, 1,
w zasadzie ten problem nie był aż tak bardzo widoczny. Natomiast
chodzi o to, że w momencie kiedy dochodzimy do tej wartości 1, to od razu to wszystko
jest resetowane, a można byłoby to opóźnić jeszcze o sekundę, więc to już taka
kosmetyczna sprawa. Możemy ustawić timeout, tylko że z timeout'em pamiętasz będzie
taki problem, że wewnątrz tej funkcji this nie będzie kierował tu gdzie chcemy, stąd
ja skorzystam z funkcji strzałkowej w ES6, żeby to this zachować i zrobimy
coś takiego, a timeout ustawię na sekundę, czyli tutaj jeżeli ta wartość ma zero
to ja chcę jeszcze sekundę poczekać zanim to wszystko zresetuje. Okej, jak wspomniałem,
tylko taka kosmetyka, ale raz jeszcze zobaczymy sobie jak będzie to wyglądać, czyli
jeżeli dojdziemy do 1 to jeszcze ta sekunda, o dokładnie
jeszcze 0 się wyświetli i jeszcze sekundę poczekamy wcześniej tak szybko to przeskoczyło, że tego
zera praktycznie nie widzieliśmy. No i teraz od nowa oczywiście możemy odliczać. Gdybyśmy
tutaj byli przebiegli to możemy tę
wartość, jak widzisz, zwiększać i wtedy ta aplikacja też na to będzie reagować i będzie odliczać
od tej wartości, nic się tutaj nie popsuje, będzie to jak najbardziej działać poprawnie, mógłbym
również przyspieszyć zmniejszanie tej wartości i ta
aplikacja zakończy się po prostu szybciej. Okej, to zatem tyle, taki
miniprojekcik, mam nadzieję, że ci się podobał, wykorzystaliśmy już
wiele rzeczy, których do tej pory się nauczyłeś. Przede wszystkim przypisywanie eventów
czy korzystanie z v-show. No i też powiedziałem ci dlaczego v-show
tutaj będzie wydaje mi się lepszym rozwiązaniem niż w if.