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
Wiesz już w jaki sposób możemy przypisywać dane do instancji
Vue i jak je wykorzystywać potem w szablonie. Również widziałeś jak korzystać
z metod, natomiast taką trzecią składową, która działa podobnie są
wyliczone właściwości, czyli z angielskiego computed properties i teraz
jeżeli byśmy sobie tutaj przeszli, zobacz że do data dodałem sobie first name, last name Jan
Kowalski będę to chciał za moment wyświetlić i co jest ważne to nie
mówiłem ci jeszcze o tym, ale w tej interpolacji tutaj możemy nie tylko się
odwołać na przykład do first name, ale możemy wykonywać dowolne wyrażenia JavaScript'owe. Nie
zadziałają instrukcje takie złożone jak na przykład if, ale proste wyrażenia
na przykład dwa plus dwa, zobacz, bez problemu nam zadziałają i Vue
nam to wyliczy jako 4. Z tego powodu, jeżeli chciałbym pełne imię i nazwisko
wyświetlić, to mogę napisać first name i tak normalnie jak w JavaScript'ie to
robimy. Połączyć to z takim stringiem gdzie
mamy jedną spację i dopisać do tego last name, to nam bez problemu
zadziała. Natomiast mógłbyś pomyśleć, że w zasadzie wolałbyś sobie odseparować
tę logikę, która jest tutaj do na przykład metody i moglibyśmy
stworzyć metodę którą byśmy nazywali full name i z niej
byśmy to chcieli zwrócić, więc tutaj byśmy napisali return i pamiętaj,
że żeby się odwołać do czegoś co jest w data lub do innej metody, która by tutaj była,
to robimy to poprzez this, bo wszystkie rzeczy, raz jeszcze przypominam, które są
w data i w methods są proksowane do głównej instancji,
dlatego są dostępne poprzez this, więc to nie jest tak, że this kieruje
na data, nie, wszystkie te rzeczy są przypisywane bezpośrednio
do tej instancji, powiemy sobie o tym później trochę więcej, więc this
first name i jak najbardziej możemy tutaj zrobić konkatenację z this last
name i teraz byśmy taką metodę tutaj mogli wywołać pisząc
po prostu full name, ale oczywiście musimy
ją wywołać w ten sposób. Po odświeżeniu będzie to działać tak samo, natomiast
jest jeszcze jedna lepsza metoda na to, aby wyświetlić
to w ten sposób, bo co jest ważne to i wynika to z ograniczenień samego języka
JavaScript. Nie mogę tutaj stworzyć full name i napisać że to jest this first
name plus this last name, bo na etapie tworzenia tego obiektu this
nie będzie kierować na ten obiekt. Natomiast możemy dodać sobie
tutaj klucz, który się nazywa computed jest to również
obiekt i w nim możemy dodawać właściwości. Chciałbym tutaj wpisać full
name bez wzywania tylko jako metodę, dlatego usunę to z metody,
a wstawię tutaj i będziemy mieli full name i jest to funkcja. Natomiast
jeżeli podamy to w ten sposób Vue wywoła to jako właśnie
funkcje i to co tam jest nam zwróci i to nam również zadziała. Natomiast
mógłbyś zapytać czy jest jakaś różnica pomiędzy computed a methods,
poza tym, że przy computed nie muszę podawać tych nawiasów okrągłych, czyli nie
wywołuje takiej metody. Dobre pytanie. Oczywiście jest taka różnica i
już spieszę ci z wyjaśnieniem jaka jest różnica. Najważniejsza
różnica jest taka i ona wynika z bardzo dobrej optymalizacji Vue czy
z dążenia Vue do bycia wydajnym framework'iem i ta różnica polega na tym, że metody są
wywoływane za każdym razem kiedy Vue renderuje widok od nowa. Teraz
pytanie kiedy Vue renderuje widok od nowa. Otóż wtedy kiedy zmienią się jakieś dane.
Mówiłem ci, że za pomocą wirtualnego DOM'u Vue wie, że na przykład ma nie
zmieniać danych w jakimś jednym elemencie, ale zmienić w drugim. Natomiast sam
fakt, że Vue próbuje coś zmienić, coś analizuje w tym wirtualnym DOM'ie, jest
tak naprawdę wykonywany wtedy, kiedy jakieś dane się zmienią i
wszystkie metody wtedy zawsze będą wykonywane od nowa, natomiast computed properties
nie. Vue potrafi sobie przeanalizować, że w takiej computed
o nazwie full name korzystamy z first name i last name, a więc jeżeli tutaj
będzie rendering całej tej aplikacji i tego szablonu to Vue
sobie sprawdzi, że ani first name ani last name się nie zmieniło, więc w zasadzie nie
będzie wywoływać tej funkcji od nowa, tylko zwróci zapisaną wcześniej w pamięci
podręcznej wartość i to można udowodnić robiąc console.log i wpiszemy
tutaj na przykład full name. Będziemy wiedzieli, że jeśli taki console.log się
wykona to ta funkcja się wykonała. Zobaczmy, widzimy że to się na pewno wykonało,
natomiast jak teraz sprawić, żeby Vue od nowa coś tutaj spróbowało przerenderować. Może
zrobimy to tak, że dodamy do tego data jakąś nową
właściwość, będzie to powiedzmy age: 32, to nie
ma na razie znaczenia i wstawimy ją w tym miejscu, 32,
czy w zasadzie age, okej to mam dynamicznie podmienione. Pojawiło nam się
to tutaj, mamy console.log full name i teraz przejdźmy do panelu
Vue i zmienimy sobie wartość 32. Przy okazji fajna rzecz, to
narzędzie zauważ, jeżeli wykryje, że jest to number, to pozwala nam dodawać i odejmować, a
również odpowiednimi skrótami klawiszowymi można dodawać po 5, 10
czy po 100 wartości. W tym przypadku tutaj możemy tylko zmienić
ten string. Jeżeli cokolwiek tutaj zmienię, zobacz, że na stronie ta
wartość się zmienia, ale zobaczymy do konsoli czy full name się wykonało ponownie,
nie i to pokazuje, że Vue jest na tyle inteligentnym framework'iem,
że wie, że nie ma sensu tej funkcji wykonywać od nowa, bo na pewno wynik
i tak będzie taki sam, więc to nie jest tak że Vue ją wykonuje, ale nie podmienia tego
na stronie, bo wie, że wynik jest taki sam. Vue w ogóle tej funkcji nie wykonał,
co widzimy po tym, że ten console.log się nie wykonał. Natomiast gdybyśmy to mieli w methods i
gdybyśmy tutaj wywoływali sobie full name, to
widzimy console.log, ale kiedy coś zmienimy, czyli za
każdym rerendering'iem, zobacz, full name jest wykonywany, widzimy
że 5 razy się wykonało, a to nam pokazuje, że metody się wykonują za każdym rerendering'iem,
a computed properties nie. Zatem teraz, kiedy korzystać
z computed properties, a kiedy z method. Też dobre pytanie, wyobraź
sobie, że chcielibyśmy albo wyświetlić datę albo na przykład wyświetlić jakąś losową liczbę. Gdybym stworzył
sobie computed property. Okej, może to wrócimy tutaj
do computed i gdybym stworzył computed property w której w ogóle bym nie
korzystał z this, bo przecież nie muszę i nazwałbym ją na przykład random i powiedzmy
chcę zwrócić randomowy string. Zrobimy return math random, to nam zwraca
randomową liczbę, możemy ją zamienić na string o wartości szesnastkowej w ten sposób i
jeszcze odciąć dwa pierwsze znaki, bo tam
będzie znak na przykład zero kropka i tak dalej. Chce to odciąć i ten
random sobie wyświetlimy tutaj zamiast age, w ten
sposób. Sprawdzimy, taki ciąg został
wygenerowany i teraz jeżeli coś zmienimy, tutaj, zobacz,
że ten string w ogóle się nie zmienia, czyli jeżeli chciałbyś mieć computed property, która
wykonuje jakiś kod i coś zwraca, która nie korzysta nigdzie wewnątrz z this, albo
gdybyś tutaj zwracał aktualną datę, to ona nigdy nie zostanie podmieniona. Do
takiego celu powinniśmy wykorzystać metodę, bo metoda jak zauważyłeś,
za każdym razem jest wykonywana od nowa, więc oczywiście
metodę trzeba wywołać, żeby nam się takie dziwne rzeczy nie
pojawiały jak kod tej funkcji. No i teraz widzimy taki string,
ale jeżeli coś zmienimy, okej tutaj dodajemy,
powinno to być wywoływane od nowa, dlaczego tak się
nie dzieje. Vue jest znowu na tyle inteligentny, że zauważyło, że age nigdzie
nie jest w szablonie, więc jeżeli age się zmienia to nie trzeba go renderować, więc dodajmy
sobie tutaj page, okej. Mamy
age 32 i zmieńmy ten age i jak widzisz ten string nad
wiekiem również się zmienia. Jeżeli byśmy teraz jeszcze, bo chcę Ci to
udowodnić random wstawili tutaj i wywołali
to tutaj jako właściwość, zmieniam
age, a ten string nad nią się nie zmienia. Czyli to nam właśnie pokazuje
to, że nie powinniśmy zwracać wyliczonych właściwości
jakich rzeczy, które nie korzystają gdzieś z this, które nie odwołują
się do danych zapisanych tutaj. Bo jeżeli tak będziemy robić to Vue nigdy tego nie podmieni
i jeżeli chcemy tam mieć dane, które mają się zmieniać za każdym rerendering,
to powinniśmy wstawiać je do tablicy, czy do obiektu methods, dlatego
ja to wstawię tutaj na samym końcu. Okej, ten console.log również
tutaj pozostaiwe i w zasadzie w tej lekcji to jest wszystko, czyli podsumowując, wyliczone
właściwości pozwalają ci na to, aby zwrócić jakieś
dane, ale skorzystać z tego tak jak w normalnej właściwości. Tutaj
jeszcze powrócimy do takiego zapisu, czyli mamy full name, a to bazuje na
dane, które są w tym miejscu, jeżeli się zmieni first name,
oczywiście zostanie to od nowa wykonane i na stronie zostanie
podmienione. Natomiast jeżeli się nie zmieni nigdy się drugi raz
nie wykona ta funkcja dzięki temu może być naprawdę bardzo bardzo wydajnym
rozwiązaniem dla twojej aplikacji internetowej. Natomiast jeżeli chcesz, żeby za
każdym razem rerenderingiem coś pojawiało się od nowa, było od nowa wyliczane. Skorzystaj
z metody, ale pamiętaj, że z metod korzysta się wywołując je tutaj parą
nawiasów okrągłych.