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
Dążenie do świetnej optymalizacji wydajności Vue, wiąże
się również w pewnym takim problemem, o którym powinieneś
wiedzieć, którego powinieneś być świadom, żeby nie być zaskoczonym. Dlatego
chcę Ci pokazać jedną rzecz. Wspominałem już wielokrotnie że Vue stara się jak może nie
renderować wszystkiego od nowa, ale reużywać elementy html, które
już ma, więc mając taką aplikację jak w lekcji poprzedniej wyrenderowaniem
sobie tutaj listę użytkowników. Natomiast teraz pytanie brzmi, co
by było gdybym chciał pomieszać tą listę czyli chciałbym po prostu w tablicy
coś zmienić. Zmienić po prostu kolejność. Do naszej strony dołączyłem z sieci
cdn bibliotekę lodash i na razie widzisz wszystko osadzamy tutaj bezpośrednio,
ale kiedy będziemy pracować na przykład npm, fajnie można ją będzie w ES6 zaimportować. Nie
jest to na razie istotne. Ważne jest to, że ta biblioteka daje nam globalny obiekt
podkreślnika, czyli jeżeli kiedykolwiek korzystałeś z underscore js,
jest to bardzo podobne i po to ją sobie zaimportowałem. Ona ma
na pewno metodę shuffle, która pozwoli nam tablicę pomieszać i
żebyśmy nie musieli tego implementować sami, to po prostu dodałem
tę bibliotekę i teraz dodamy sobie zdarzenie kliknięcia do przycisku i napiszemy
tutaj Shuffle, czyli pomieszaj i dodamy taką metodę oczywiście. Ta
metoda będzie modyfikować naszą tablice, dlatego muszę się odwołać do this
users i ją nadpisać nową tablicą, ale być może pamiętasz jak ci mówiłem,
że Vue jest tutaj super inteligentne i jeżeli jakąś tablicę nadpiszemy nową
tablicę to Vue potrafi porównać jej elementy i na tej podstawie wie,
które elementy w drzewie DOM modyfikować, które nie, więc jeżeli
ja teraz pomieszam tablicę i ją tutaj przypiszę to fizycznie te obiekty, które są wewnątrz,
z punktu widzenia Vue to są dokładnie te same obiekty. Przez referencje będą
porównywane, więc to są dokładnie te same elementy, ale w innej kolejności, więc odwołam
się do biblioteki lodash i następnie do Shuffle i podamy sobie this
users. Gdybym zrobił to tylko w ten sposób, to by nie zadziałało, dlatego że
Shuffle zwraca nową tablicę, a nie modyfikuje tej, którą podaliśmy. Stąd, skoro
zwracam nową, to muszę ją przepisać tutaj, więc tablica sama w sobie jest nowa, ale
obiekty wewnątrz jak to bywa w JavaScripcie to są te same obiekty. Nie są
one kopiowane, tylko są przekazywane przez referencje, więc sprawdźmy. Wystarczy
jak widzisz tyle, żeby mieszać sobie na stronie tym wszystkim. Vue
musi to od nowa nam wyświetlić, co nie znaczy, że renderuje
to od nowa, więc na razie jeszcze nie pokazałem jakie mamy problem, ale co
jest ważne to Vue reużywa sobie elementy, które są tutaj, czyli
mamy te elementy td i Vue tak naprawdę kiedy mieszamy, zmieni tylko dane
w tych elementach, ale tak naprawdę nie będzie zmieniał ich kolejności.
No i mogę Ci to udowodnić. Wyobraź sobie, że chcielibyśmy tutaj gdzie mamy
username, dodać sobie input i niech
to będzie checkbox. Nie ma do końca znaczenia jaki to będzie input. Jeżeli byłby to tekstowy, to
mógłbyś tam coś wpisać i on nie jest kontrolowany przez Vue, bo
to jest ważne jest to zwykły taki element. Jeżeli go zaznaczę, Vue tak
naprawdę o tym nie wie i wydawałoby się, że jeżeli pomieszam to Anna Nowak znajdzie
się w innym miejscu razem z tym checkbox'em. Okazuje się, że nie. Zauważ,
że checkbox cały czas pozostaje w drugim elemencie, a dane się
zmieniają i to nam pokazuje, że Vue tak naprawdę nie zamienia kolejności
tych elementów tr, ale zmienia wartości tych pól, które są
wewnątrz, czyli td, które są akurat w tr. No i to może
być problemem, bo jeżeli byłby tutaj input tekstowy, do którego coś bym wpisał to
Vue, kiedy zmienią się dane i od nowa nam to jakby tutaj wyświetli,
to nie weźmie tego pod uwagę, bo reużywa elementy najbardziej
jak tylko może. Pytanie, czy można coś z tym zrobić? Okazuje się, że tak,
żeby elementy nie były w ten sposób reużywane musimy każdemu z nich przypisać
unikalny klucz, dlatego tych użytkowników, których mam tutaj, to nadałem im jeszcze identyfikatory,
jeżeli będziesz pobierał dane z jakiegoś serwera, na przykład Ajax'em
to prawdopodobnie tam będą jakieś unikalne identyfikatory i to może
ci się przydać. Trzeba będzie dodać atrybut key do każdego
wiersza, który tutaj generujemy. Natomiast jeżeli zrobiłbym to w ten sposób, to
byłby to atrybut key wpisane literalnie, a ja chcę żeby on był dynamiczny,
czyli muszę go zbindować i wtedy jeśli napiszę user
ID to wiemy, że zostanie to nie wpisane literalnie jako
user id, tylko zostanie wyciągnięte z danego użytkownika. Każdy id
jest inne, więc Vue będzie miał każdy z tych wierszy zidentyfikowany
unikalnie i teraz zauważ, że tego problemu już nie będzie. Tam
gdzie podąży Anna Nowak, tam podąży również cały checkbox, bo tak
naprawdę cały tr będzie w to miejsce wstawiany,
czyli to można powiedzieć, że kosztuje nas punktu widzenia wydajnościowego troszeczkę więcej,
ale zapobiega nam takim oto problemom, czyli zawsze jeżeli tylko
możesz, tak też zalecają twórcy Vue. Chyba, że mamy bardzo prostą jakąś strukturę,
jakąś listę, która nie będzie się zmieniać jeżeli chodzi o kolejność, to nie
musisz tego robić, ale w zasadzie w większości przypadków, jeśli tylko możesz to
nadawaj unikalne key, to może być cokolwiek, ale ważne,
żeby to było unikalne dla każdego wiersza generowanego przez v-for i wtedy
masz pewność, że nie będzie tego typu problemów, więc jeżeli na jakiś dziwny problem
napotkasz. Przypomnij sobie o tym, że być może zabrakło atrybutu key.