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
Dokończmy nasz praktyczny projekt. Mam nadzieję, że ci się podoba. Chciałbym
sprawić, aby teraz to wszystko mogło być zamknięte w jeszcze jednym
komponencie rodzicu. Zobaczmy, jak teraz wygląda struktura, jeżeli przejdziemy sobie do Vue,
mamy root, czyli główną aplikację i kilka takich komponentów edu
user natomiast chciałbym je móc zamknąć w taki sposób, żebyśmy w zasadzie
do tej głównej aplikacji mogli od razu wstawić edu users, tak będzie się nazywał
komponent. Nie chcę żeby tutaj była ta tabela, czyli główna aplikacja będzie
mogła sobie w zasadzie zaimportować taki komponent kiedy będziemy pracowali z webpackiem i z ES6
i wstawić go tutaj bez żadnego problemu. On wtedy nawet nie byłby globalny,
tylko byłby importowane i tutaj na tej głównej aplikacji mielibyśmy tak jak Ci pokazywałam
wcześniej klucz components, gdzie moglibyśmy te komponenty podawać i
tagi jakie mają przyjmować. Natomiast dokładnie to będę chciał zrobić teraz,
czyli stworzenie komponentów rodzica dla edu user. Będzie on
globalny i nazwiemy go edu users, on
nie będzie miał praktycznie żadnej logiki, ale będzie miał templatkę. No
i co się znajdzie w tej templatce? Dokładnie to, co my tutaj czyli całe nasze table, ja stąd
chcę wyciąć, a chcę tutaj wstawić edu users, w ten
sposób, a to co było tam wstawimy sobie w to miejsce i od razu
pod będziemy się pewnego problemu, mianowicie tego, że tutaj przeglądarka jeżeli
widziała coś innego niż w tr, to wyrzucała to poza tabelkę. Jeżeli tutaj mamy taką
templatkę w formie stringu to nie będzie z tym kłopotu, dlatego zamiast pisać tutaj is edu
user możemy bezpośrednio skorzystać z edu user, po
prostu i tutaj go domknąć, natomiast
powiem ci jeszcze o jednej rzeczy. Jeżeli nic nie przekazujemy do wewnątrz komponentu i nie
mam na myśli prop, ale dane, które będzie można tam później wstawiać, jeszcze ci
tego nie pokazywałem, to możemy komponent od razu domknąć. Nie możemy
tego zrobić jeżeli pracujemy poza taką templatką, czyli tutaj edu
users, nie mogę domknąć od razu, bo będzie to kłopot. Przeglądarka tego poprawnie
nie zrozumie, natomiast taki element uzna za custom'owy element i będzie wszystko w porządku. Dopiero
później Vue to podmieni, więc jeżeli pracujemy w takiej templatce, można od
razu taki element domknąć. Chyba żebyśmy do niego coś przekazywali, ale
będziemy to robić później za pomocą tak zwanych slotów. Okej, czyli
to jest pierwsza rzecz, którą chcemy zrobić, ale z tego co widzimy tutaj to
iterujemy w tej templatce po users.
No właśnie i nasz komponent edu users nie ma do tego dostępu,
więc żebym miał do tego dostęp musimy mu to przekazać jako prop, czyli
on musi przyjmować takie props'y users i w momencie gdzie
wstawiamy ten komponent będziemy mu chcieli to przekazać, users równa się users.
Jesteśmy teraz w głównej aplikacji, ona ma taką tablice
users i to dokładnie tam przekażemy, więc ten komponent edu
users wyrenderuje taką tablice właśnie z tymi elementami, taką
tabelę w zasadzie i będzie wszystko okej. Tutaj przekazujemy
user, tutaj nie powinno się nic zmienić, okej. Powinno
być wszystko w porządku, oprócz tego, że tutaj mamy pewno metodę
remove, ale o tym za moment. Spróbujmy odświeżyć. No właśnie
i pojawił nam się błąd. Okej, jak widzisz mamy błąd
i ostrzeżenie. Pierwsza rzecz to tutaj mówimy o kluczach, czyli
to co ci mówiłem wcześniej, Vue chce żebyśmy korzystali z unikalnych
kluczy. Warto z tego korzystać na pętlach, ja już wcześniej o tym mówiłem, czyli tutaj
nasi użytkownicy mają unikalne id od 1 do 5,
więc warto z tego skorzystać w tym miejscu, bindując key
na wartość user id, okej, zobaczymy. Jeden
błąd powinien zniknąć, tak też się stało i teraz pojawi nam się jeszcze jeden, więc
zastanówmy się, w którym miejscu tutaj coś poszło nie tak, musimy
się nad tym na chwilkę pochylić, edu users i przekazuje users. Tutaj
przyjąłem to jako prop, więc powinno być w porządku, okej,
tutaj zabrakło s, czyli props, teraz powinno być wszystko okej. Jeszcze
jakiś błąd się pojawił, ale to ten którego się spodziewaliśmy. Zauważ, że teraz
tak naprawdę w tym naszym komponencie mówimy, że nasłuchujemy na komponencie
dziecko, dziecku edu user na zdarzenie remove, czyli kiedy ten komponent
zrobi emit remove, to chcemy wywołać metodę remove,
właśnie tutaj, ale takiej metody w tym miejscu nie mamy i nawet
gdybyśmy mieli to musielibyśmy ją wywołać, a ona by musiała wyemitować
zdarzenie remove jeszcze wyżej i dopiero tutaj musielibyśmy na nie nasłuchiwać. Mam
nadzieję, że to widzisz i kiedy na nie byśmy nasłuchiwali dopiero w aplikacji moglibyśmy usunąć
coś z tablicy. Więc im więcej mamy poziomów zagnieżdżenia, które widać w
tym miejscu, zobacz, to tym więcej musimy emitować. Teraz stąd emitujemy
jeden poziom wyżej i stąd musielibyśmy jeszcze wyżej, dlatego jest to świetne miejsce, żeby
skorzystać z event bus'a, który ci wcześniej w jednej lekcji pokazywałem. Napiszmy
sobie event równa się new Vue, okej i
zasadzie możemy mu od razu dodać jakąś metodę, żeby nam się troszeczkę łatwiej
z tym pracowało, methods. Napiszmy remove. Będzie to
funkcja, która przyjmie id i ona
zrobi to, co robiliśmy wcześniej. Tutaj nic nowego nie pokazuje, this emit remove id i
teraz będziemy mogli w dowolnym miejscu w tym komponencie na przykład dziecka, po
pierwsze to będziemy mogli usunąć, a w komponencie,
w którym tak naprawdę klikamy, nie będziemy robić this
emit tylko event, event, na
nim nie będę już robił emit, bo właśnie mu dałem metodę, która się nazywa remove, więc
bezpośrednio ją sobie wywołam i event remove. Wracamy
w to miejsce. Ona jak się wykona to na tym evencie zrobimy emit remove i
teraz wystarczy na to nasłuchiwać w aplikacji tutaj na samym dole. Zamiast metody
remove, którą bezpośrednio wywoływaliśmy to w hook'u created, też już ci to pokazywałem,
będziemy chcieli
zrobić event, ten u góry, który jest on remove. Wykonaj
this remove, czyli tak naprawdę tę naszą funkcję. Teraz powinno
nam to działać i nieważne ile mamy poziomów zagnieżdżenia ty komponentów, te nazwy
oczywiście remove można lepiej dostosować na przykład remove user i tak dalej,
ale jak widzisz nie musimy nic przekazywać, jest wszystko w porządku. Sprawdźmy
sobie teraz, jeżeli Anna Nowak będziemy chcieli zmienić
Anna Nowak na przykład na Nowaczyk, zapisuje.
Jak widzisz, zostało tutaj odzwierciedlone to bez żadnego event'u po prostu
zmieniliśmy coś i setter się wykonał, więc Vue zrobił to za nas, ale
w momencie kiedy usuwamy to już za pomocą naszej eventów będzie działać, więc
tak mogłoby to wyglądać. Oczywiście możemy również tutaj dodać sobie możliwość edycji
wieku. Zachęcam cię do tego żebyś to zrobił, w miejscu gdzie ja
zrobiłem coś takiego, czyli tutaj gdzie dodaliśmy sobie input.
Wystarczy, że identyczną rzecz zrobisz tutaj gdzie mamy user age i możesz
dodać na przykład pole o typie number z modyfikatorem number. Ja
teraz tego nie będę robił, ale polecam ci żebyś również spróbował sobie
coś takiego zaimplementować. Logika identyczna jak tutaj, ale modyfikator number po to,
że jeżeli coś zmienimy w takim polu to żeby było to zapisywane w obiekcie,
w tym miejscu właśnie jako number. Jak widzisz to wszystko może nam się przydać. W tej
lekcji zatem to wszystko mam nadzieję, że te trzy lekcje były dla ciebie ciekawe, że ten
praktyczny projekt pokazał ci wiele technik. Natomiast nie kończymy jeszcze przygody
z samymi komponentami, bo jest jeszcze trochę informacji, które chciałbym ci na ich temat przekazać.