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 w jaki sposób możemy kontrolować dodawanie lub usuwanie klas
CSS do elementów html, a co zatym idzie oczywiście
jak możemy kontrolować ich wygląd, więc to co ja będę chciał zrobić w
tej lekcji, to jest to, aby po pierwsze ukryć tę wiadomość. Twoja wiadomość
została wysłana i będziemy chcieli wysłać formularz. Będziemy
chwilę mogli poczekać tutaj przycisk zmienimy na taki wczytujący się i kiedy on się wyśle
ukryjemy cały formularz, a wyświetli mi tę wiadomość. W tym kursie jeszcze później pokażę
ci w jaki sposób możemy korzystać ze specjalnych dyrektyw pokazujących i ukrywających
elementy, ale na razie pokażę ci jak to zrobić z użyciem klas i w Spectre CSS,
czyli we framework'u, z którego tutaj korzystam, mamy taką klasę the pauza none.
Jeżeli ją dodamy do czegokolwiek, to ten element jest ukryty, więc będziemy chcieli
z niej skorzystać. To teraz pytanie jak to zrobić. Ja tutaj mam taki formularz,
który mieliśmy już wcześniej i zrobiłem rzecz taką, że po pierwsze ten
przycisk będę chciał wyłączyć i jeżeli isSending ma wartość true
albo sent ma wartość true i mam tutaj isSending oraz sent
i po kliknięciu w ten przycisk, czyli w zasadzie po wysłaniu formularza, mamy to tutaj. Będziemy
robić metodę submit, a ta metoda sprawi, że isSending ustawię na true,
więc przetestujemy. Widzimy, że ten przycisk się wtedy wyłącza, ale to
nie jest wszystko, co będziemy chcieli zrobić, bo chciałbym się skupić na klasach, przede wszystkim,
więc jak możemy kontrolować klasy. Znowu będzie to w sposób
deklaratywny, czyli tutaj sobie coś deklarujemy, a to będzie zależne
od danych jakie są w tej instancji, więc zauważ, że ja
tutaj mam już dodaną klasę i w niej nie będziemy nic zmieniać, więc dobra wiadomość
jest taka, że do elementu możesz mieć dodane już różne klasy, a dodatkowo
zbindować sobie ten atrybut. No i jak bind'ujemy atrybuty? Dokładnie tak jak
tutaj, czyli albo v-bind. Już to wielokrotnie widziałeś
dzisiaj czy w ogóle w tym kursie. Możemy napisać v-band class lub po
prostu samo class i właśnie to jest ważne, że to co tutaj podamy będzie połączone
z atrybutem, który już istnieje, więc nie ma problemu, że ten atrybut tutaj jest. Tych
klas nie będę musiał dodawać wewnątrz tego atrybutu. No i teraz jest
to specjalnego przeznaczenia atrybut class i również style, o
której będziemy mówić niebawem i to znaczy, że tutaj mamy specjalny zapis
i tutaj możemy podać taki oto obiekt. Wiadomo,
że dla nas jest to tak naprawdę string, ale Vue potrafi sobie to sparsować i w tym obiekcie
podajemy jako klucz nazwę docelowej klasy, którą chcielibyśmy przepisać
i ja do tego przycisku chciałbym przypisać klasę loading, a tutaj podajemy
warunek, czyli jeżeli tutaj będzie true to ta klasa będzie dodana,
a jeżeli false to nie. No i teraz kiedy chcemy dodać klasę loading. Otóż
wtedy, kiedy isSending jest ustawione na wartość true, czyli jeżeli wpisze
isSending to wtedy ta klasa ma być dodana do tych klas,
które są już tutaj. Czyli jeżeli klikamy na przycisk i isSending ustawimy na true, powinna
ta klasa zostać dodana i powinniśmy taki spinner widzieć na tym przycisku, więc
sprawdźmy. Jak widzisz dokładnie tak się stało. Oczywiście, jeżeli podejrzymy, to
tutaj się pojawi na tym przycisku gdziekolwiek
on jest, czyli tutaj klasa loading, więc do tych klas zostało
to dodane, no i ważne jest to, że tutaj oczywiście możesz dodawać sobie kolejne właściwości
do takiego obiektu i będą to kolejne klasy, przy każdej możesz mieć warunek. Natomiast
to, co jest ciekawe, to nie musisz tego tutaj wpisywać w taki sposób. Mógłbyś
sobie tutaj podać nazwę na przykład computed property,
która byłaby wyliczona w jakiś sposób, w zasadzie jest
to dosyć proste, bo potem moglibyśmy napisać button styles i
tutaj moglibyśmy dodać computed button
styles, wiemy że computed properties są twoje funkcje tak naprawdę tutaj i
stąd byśmy mogli zwrócić taki oto obiekt, więc powinno to zadziałać
w tak samo, sprawdźmy. Tylko, że isSending, no właśnie, bardzo ważna
rzecz, tutaj musi być podane z this. Okej, zobaczymy. Jak
widzisz działa to dokładnie tak samo, więc jak masz więcej takich styli może lepiej
ci to będzie zapisać po prostu tutaj w takiej computed, ale wiedz,
że możesz to również wstawić w taki oto sposób bezpośrednio w tym
wyrażeniu w wartości atrybutu. Okej, zatem teraz jeszcze chciałbym
dodać sobie klasę tutaj do tego post'a. Będzie to klasa, może tutaj ją wpiszemy
w taki sposób, żebyś sobie również to utrwalił. Tak jak mówiłem d-none, czyli display
none, taka klasa jest zdefiniowana i ustalimy tutaj not sent, czyli
jeżeli sent nie ma wartości true to ten
element powinien być niewidoczny. Jest niewidoczny, chociaż w drzewie
DOM oczywiście on istnieje, ale ma podaną klasę display none, która
właśnie w ten sposób ten element ukrywa, a ten element jest pokazany, więc jemu
może zrobimy rzecz odwrotną. Jest to cały ten formularz. Zauważ,
że on też tutaj ma klasę. Może mieć, może nie mieć, to wszystko jest łączone w jedno.
Jemu chcę dodać taką klasę jeżeli sent ma wartość true. Okej,
sprawdźmy i jak widzisz wysyłamy, tylko że
nigdy nie zmieniliśmy wartości sent, więc tutaj będę chciał może po jednej
sekundzie czy po dwóch sekundach ją zmienić, a więc ustalimy sobie timeout. Przy
okazji zobaczysz jaki jest problem przy timeout'ach. Jeżeli
ustawimy timeout na dwie sekundy i chciałbym tutaj zmienić this sent
na true to nam to nie zadziała. Być może
wiesz dlaczego. Otóż this wewnątrz tej funkcji jest zupełnie w
zupełnie innym kontekście, czyli nie odwołuje się do naszego obiektu, więc tutaj musiałbyś
zrobić coś takiego, na przykład i tutaj zmienić to na vm. Wtedy
wiemy, że odwołujemy się do odpowiedniego obiektu lub możesz skorzystać, co
jest lepszym rozwiązaniem z funkcji strzałkowej w EcmaScript6. Polecam
ci EcmaScript6, korzystanie z tego i wtedy, jeżeli
tak zrobimy, stworzymy taką funkcję, to this nie jest tutaj od nowa
przypisywane, czyli this jest dziedziczone z kontekstu wyżej i wtedy to zadziała. Natomiast
pamiętajmy, że ten kod bezpośrednio wykonujemy w przeglądarce, jeżeli przeglądarka
nie wspiera ES6, to będzie błąd, dlatego ja do tej pory nie korzystałem w tym
się jeszcze ze zbyt wielu rzeczy w ES6, ale potem pokażę ci jak
pracować w taki sposób, że ten kod będzie transmitowany do EcmaScript5 i
wtedy nie będzie problemu. Niemniej jednak zostałem sobie to w ten sposób, w jaki
sposób obejdziesz ten problem z this, to zależy od ciebie, czyli teraz wysyłamy
i po dwóch sekundach zmieniliśmy wartość i jak widzisz wszystko tutaj zostało
odzwierciedlone, więc znowu widzimy jak Vue jest bardzo przydatne. Wszystko
możemy tutaj zadeklarować, co się ma dziać na podstawie jakich
danych, a później te dane zmieniamy tylko w tym miejscu i jak widzisz dodawanie
klas i wielu innych rzeczy, takie jak na przykład tutaj disabled
dla atrybutu, tego przycisku jest bardzo proste i dzieje
się w sposób automatyczny. Na koniec chciałbym ci pokazać jeszcze jedną
rzecz, mianowicie, taki obiekty, jak są tutaj, można podawać również w zapisie
tablicowym, czyli gdybyś miał więcej takich obiektów, możesz je podać w ten sposób. Oczywiście,
jeżeli je wpisujemy ręcznie to w zasadzie w jednym obiekcie można uzupełnić pozostałe właściwości,
ale jeżeli podawałbyś je jako computed property to właśnie tutaj z takiej
funkcji mógłbyś zrobić tablice z wieloma takimi obiektami również by to zadziałało
poprawnie. Co ciekawe tutaj można również przekazać klasy w sposób
bezpośredni. Moglibyśmy napisać klasa, klasa 2, oczywiście
jeżeli nie dam cudzysłowów, takich apostrofów, to wtedy jest traktowane jako
computed property lub element z data. Warto o
tym pamiętać, a także można to połączyć, czyli mogę tutaj zrobić coś
takiego, że mam obiekt, w którym jest warunek, że display
none ma być dodane jeżeli not sent, ale drugą klasę mogę dodawać zawsze. Jeżeli
zawsze dodaje taką samą, w zasadzie lepiej ją dopisać tutaj bezpośrednio, ale
chcę ci pokazać, że można to zrobić i powiedzmy napiszemy sobie message class
i dodam sobie w tym miejscu, to oznacza, że ona może być dynamiczna,
może być zmieniona. Jeżeli zostanie zmieniona, zmieni się tutaj. No i zmieni się również na
tym elemencie i jest tam taka klasa jak post
primary i ten post będzie miał po prostu
inny kolor. Zobaczymy, kiedy on się pojawi. Jak widzisz, ma zupełnie
inny kolor i post primary zostało tutaj dodane, więc z tej lekcji zapamiętaj,
że klasy można dodawać w taki sposób, że dajemy obiekt. Nazwa klasy
i warunek możemy podać również tablice z nazwami klas, jeżeli
damy to w apostrofach. Jeżeli podam tylko takie nazwy, to jest to wtedy data
lub computed property i tutaj możesz również zwracać
computed property tak jak zrobiliśmy to w tym miejscu, która zwraca po prostu
obiekt. Okej, zatem to tyle w tej lekcji, przejdźmy do kolejnego tematu.