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
W tej lekcji pokażę ci super przydatną rzecz, którą po części już poznałeś,
a jest to użycie dyrektywy v-model, ale na komponentach. Do tej
pory używaliśmy jej na polach typu input czy na przykład select i pamiętasz,
że to nam robiło Two Way Data Binding. Natomiast nie bez powodu w jednej z lekcji pokazywałem
ci jak możemy sami zaimplementować v-model, czyli musimy
nasłuchiwać na prop, która nazywa się value i ją otrzymamy
i następnie musimy do góry wypychać czy emitować
zdarzenie input lub zdarzenie change jeżeli był tam modyfikator lazy.
Jeżeli tego nie pamiętasz wróć koniecznie do tamtej lekcji, natomiast dzięki
temu, że w ten sposób działa v-model to możemy zaimplementować
sobie v-model również na własnych komponentach i będę chciał ci to teraz pokazać. Mamy
coś takiego. Fajnie to wygląda i fajnie to działa, chociaż to nie jest gotowy przykład. Te
kontrolki tak naprawdę są tutaj dostępne dzięki Spectre CSS
i jest to nic innego jak zwykły checkbox. My tutaj klikając klikamy tak
naprawdę na ten label i to zaznacza nam również w ten checkbox pod
spodem, więc to już w tym kursie widziałeś i wygląda to w następujący sposób, dokładnie
w ten sposób, nie ma tutaj żadnego JavaScriptu. Natomiast chciałbym to teraz przepisać
na komponent, żeby łatwiej można było z tego korzystać. Zauważ,
że tutaj do tego inputa przypisuje sobie jeszcze v-model agreements terms, newsletter i blilling
i to zrobiłem tutaj w formie takich obiektów, żeby nie mieć tych zmiennych
czy tych właściwości bezpośrednio na data to zgrupowałem je sobie w obiekcie i mają
one wartości false, dlatego te elementy domyślnie nie są zaznaczone.
Natomiast ja chcę to teraz przepisać na komponent, dlatego
stwórzmy sobie nowy globalny komponent, to znowu ci pokażę
jak bardzo przydatne są komponenty, nazwiemy go edu switch
i tutaj podamy jego obiekt konfiguracyjny oczywiście. Na początek potrzebujemy
jak zwykle templatki, zapiszemy ją w ES6 z użyciem template stringu, żeby
było prościej i nasza templatka będzie wyglądać następująco, będzie to cały taki
form-group i teraz co będziemy chcieli tutaj w tej templatce zrobić. Po
pierwsze będę chciał w tym miejscu umieścić slot i to nam
się za moment przyda, ale skoro stworzyliśmy edu switch to może już sobie jeden
taki switch osadźmy na stronie, żeby za moment móc zobaczyć w jaki sposób to działa. Będzie
to edu switch, będziemy go mogli domknąć dzięki temu, że zrobiłem
slota, to będzie można wpisać do niego jakąś treść i ja chcę wpisywać sobie
taką treść. Może ja tego nie będę wycinał tylko skopiuje, wstawimy w
to miejsce i to będzie wpadało do slota, czyli dokładnie w miejsce które nas
interesuje. Natomiast teraz v-model na tym checkbox'ie, nie chcę żeby
już się nam bindował, czy żeby nam uaktualniał
agreements terms, bo agreement nie jest dostępne na tym komponencie,
więc byłby błąd, tylko chcę sobie tutaj zrobić właściwość is checked,
czyli jest zaznaczony. No i oczywiście musimy ją sobie dodać, więc zrobimy data.
Pamiętaj, że przy komponentach to jest funkcja, która zwraca obiekt, a nie
obiekt bezpośrednio i tutaj zrobimy sobie is checked, domyślnie
właśnie, jaka powinna być jego wartość, czy false czy true. Otóź będę
chciał żeby domyślnie jego wartość była taka jak przekazana w prop this
value. To już też robiliśmy, więc musimy
mieć props i taką prop, która nazywa
się value. Dodatkowo ja chciałbym ją zwalidować, żeby nie tylko ją tutaj przejmować,
ale żeby ona również miała wartość boolean, żebyśmy mieli pewność, że zawsze
to będzie działać poprawnie, chociaż w przypadku v-model, który za moment dodamy, tak czy
siak powinno, ale przypomnę ci przy okazji, że jest coś takiego jak walidacja, więc
możemy powiedzieć, że interesuje nas przyjęcie prop, która nazywa się value i
ma być o typie boolean, czyli true lub false, okej,
czyli teraz po kliknięciu w ten komponent, jeżeli ten input się zaznaczy, to
będzie zmieniana wartość is checked, która jest tutaj. Natomiast domyślnie na samym początku ona
będzie miała taką wartość jak przekazana w prop value i teraz mógłbyś
mnie zapytać, w którym miejscu tutaj przekazujemy prop value. Musiałbym to zrobić w
ten sposób, prawda. Natomiast my chcemy zrobić coś innego. Tutaj na zewnątrz chcę
napisać v-model równa się i to co mieliśmy w tym miejscu agreements terms i
automatycznie v-model co pokazywałem ci w lekcji gdzie implementowaliśmy własny
v-model, on działa także właśnie do takiego komponentu, czy do pola
input, które mieliśmy wcześniej w tym kursie, przekazuje prop o nazwie value i
właśnie dokładnie dlatego tutaj ją przyjmujemy i dzięki
temu początkową wartość is checked mogę ustawić na this value. Przy
okazji jeszcze raz ci przypomnę, że this value tutaj można użyć, bo jesteśmy wewnątrz funkcji,
a tutaj bezpośrednio na takiej na przykład instancji nie
można sobie napisać this i odwołać się do jakiegoś props, które mogłoby
być tutaj przekazywane, okej i w zasadzie tutaj prop i tak nie może
być przekazane, bo jest to główna instancja, ale pamiętaj, że tutaj do this jakbyśmy
się odwołali, to nigdy się to nie odwoła do tej instancji, bo ona jeszcze nie jest gotowa,
nie jest utworzona. Natomiast w komponentach tak zrobić można. Czyli wracając do tego,
jeżeli to przepisze v-model do mojego customowego komponentu, to domyślnie
ten v-model przekaże mi właściwość właśnie value i stąd ja ją
przyjąłem i powinno nam to działać. Zobaczmy, mamy
tutaj akceptuję regulamin, czyli slot zadziałał. Widzę, że mamy jakiś problem,
że tutaj kropka jest zbędna, okej, no i to
co jest ważne, to gdybym zmienił tutaj terms na true to true
powinno zostać przekazane też do mojego komponentu i to powinno zostać odzwierciedlone, więc
tak też się stało, czyli połowa pracy, można powiedzieć, że za
nami. Będę chciał teraz sobie powiedzieć
to trzykrotnie, zobacz jak fajnie będziemy mogli tego używać wielokrotnie, a kodu
będzie tak naprawdę dużo mniej. Tutaj mieliśmy akceptuję regulamin, więc kolejny
chciałbym tutaj zrobić, zapisz mnie na newsletter i tutaj to zaktualizujemy
i ostatni obciążaj moje
konto comiesięcznie i to sobie zrobimy na billing,
okej no i te trzy będę mógł usunąć, a zatem jak
widzisz działa to w taki sposób tylko, że mamy pewien problem, bo to jest dopiero połowa
pracy za nami. Jeżeli przejdziemy tutaj do root. Mamy te agreements, w momencie jak
kliknę na taki element, nie zmienia się to w tym miejscu. Wewnątrz się zmieniło
i możemy to potwierdzić klikając tutaj edu switch i widzimy is checked ma wartość
true, mogę ją zmienić na false i tak dalej. Natomiast chodzi o to,
że połowę pracy wykonaliśmy w ten sposób, że v-model przekazuje
nam automatycznie value, która nazywa się prop, która nazywa się value.
Natomiast on oczekuje to co robiliśmy w lekcji jakiego implementowaliśmy,
że do góry zostanie wypchnięte zdarzenie o nazwie input. No
właśnie, więc tutaj powinniśmy takie zdarzenie emitować. Za każdym razem kiedy zmieni
się is checked, czyli w zasadzie teoretycznie można by było
tutaj do tego inputa przypisać zdarzenie change
i wtedy emitować takie zdarzenie, ale można to zrobić również inaczej za
pomocą watcher'a, więc dodajmy sobie tutaj watch, będziemy
chcieli obserwować właściwość is checked, czyli kiedy ona się zmieni,
pamiętasz, że tutaj dostaniemy starą i nową wartość, możemy
je przyjąć, ale równie dobrze możemy się odwołać do tej wartości bezpośrednio, to
kiedy ona się zmieni będziemy chcieli wyemitować zdarzenie emit o nazwie
input i będziemy chcieli przekazać wartość, czyli this
is checked lub tak jak wspomniałem tutaj można
przyjąć to jako parametr i przekazać w tym miejscu, czyli za każdym razem kiedy ja klikam
tutaj, na input'ie wartość się zmienia, widzieliśmy że wewnątrz się zmienia. Na
zewnątrz wyemitujemy zdarzenie i nie musimy na to zdarzenie tutaj nasłuchiwać za pomocą
input, bo wiemy że v-model robi to za nas. Dokładnie to ci pokazywałem
we wcześniejszej lekcji i zasadzie powinno to zadziałać. Zaznaczam,
na edu switch się zmieniło na true i na root zmieniło się na true
i każdy inny można zaznaczyć i odznaczyć i jak widzisz to się tutaj
aktualizuje, więc w ten sposób stworzyliśmy sobie naprawdę fajny
reużywany komponent, który możemy w dowolnym miejscu osadzić i możemy
mu przypisać v-model mówiąc, że chcemy u nas w tej naszej głównej aplikacji
aktualizować pewne dane na podstawie tego switch'a. Możemy
również przekazać tekst, który wpada w odpowiednie miejsce a reszta wyglądu nas tak naprawdę
nie interesuje, on jest zawarty w tym miejscu. Jak zatem widzisz niewiele
kodu musieliśmy napisać, a możemy wielokrotnie używać takiego switch'a. Oczywiście
można byłoby go używać pętli i tak dalej tak jak robiliśmy to do tej pory,
okej. To zatem wszystko w tej lekcji. Mam nadzieję, że ten
przykład również ci się podobał i że będziesz pamiętał, że możesz w ten sposób tworzyć
własne komponenty, które korzystają z v-model.