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 poprzedniej lekcji pokazałem ci jak działają w języku JavaScript gettery i settery
i to powinno dać ci taki ogólny ogląd na to jak
działa Vue.js, czyli, że potrafi z tego obiektu data wyciągnąć
wszystkie klucze i przypisać je jako settery do głównej
instancji, również jako gettery. Natomiast w tej lekcji będę chciał ci
pokazać jeszcze troszeczkę więcej na temat samej instancji, czyli tego obiektu,
który jest zwracany z wywołania new vue. Mamy tutaj new vue. Troszeczkę
inaczej to zrobiłem, bo po raz pierwszy w data pojawia się u nas tablica items. Jest
to normalna tablica, jak najbardziej poprawny tutaj zapis i możesz zobaczyć, że
tutaj w wyrażeniu korzystam z items join, czyli z metody join
na tablicy. To nam połączony na przecinku i spacji wszystkie elementy tej tablicy, więc tak
to będzie wyglądać. Jest wszystko okej. Na tych tablicach jeszcze się
za moment na chwilę zatrzymamy. Natomiast to co jest niesłychanie
ważne, to w momencie kiedy jest tworzony obiekt, właśnie
poprzez wywołanie new vue, to musi się coś znajdować w data,
żeby to mogło być ustawione jako setter i getter w sposób, który pokazałem
ci w lekcji poprzedniej, czyli mamy to items, zostało to ustawione, ale
jeżeli tutaj chciałbym skorzystać sobie na przykład z powiedzmy
name, a tutaj
tego nie ma, Vue nam pokaże błąd i nie wystarczy teraz odwołać
się do tego this czy to poprzez metodę czy poprzez na przykład
vm0 i nie
wystarczy tutaj dodać name, tak jakby nam się wydawało i nie zostanie
to na stronie podmienione. Oczywiście to zostało dodane, ale to wynika z natury języka JavaScript. Pod vm0
jest jakiś obiekt, a do obiektów po kropce możemy dowolnie dodawać co nam się tylko podoba,
więc udało nam się to tutaj dodać. Oczywiście gdyby name
istniał wcześniej i zrobiłbym taki zapis to wywołał by się setter i to name
zostałoby zmienione i przerenderowany byłby widok. Natomiast, jeżeli to
nie był setter, to zostało to dodane w ten sposób. Gdybyśmy zrobili console dir
vm0 to zobaczymy
tutaj, że mamy name, które dodałem, ale jest normalna
właściwość, ona nie jest reaktywna w żaden sposób. Natomiast items, które
sobie dodaliśmy, zobacz. Jest to dodane tutaj jako
get i set, czyli console dir nam pokazuje, że na głównej instancji,
chociaż my to dodaliśmy w data, zostało to dodane do głównej instancji jako getter i
setter, więc dlatego to działa. Przy okazji, zauważ, że tutaj jest jeszcze kilka innych
rzeczy. Te które są z podkreślnikiem są takie wewnętrzne rzeczy, które musimy traktować
jako prywatne dane dla Vue. Nie powinniśmy tego w żaden sposób modyfikować,
ale okazuje się, że tutaj jest troszeczkę rzeczy poprzedzonych dolarem
i jeszcze coś z tych rzeczy zobaczymy w tym kursie. Okazuje się, że wszystko co jest z
dolarem oznacza, że jest to metoda lub jakaś właściwość
dodana przez Vue i jest to na tyle mądrze pomyślane, że
skoro wszystko co my dodajemy w data jest proksowane do głównego obiektu, a
twórca Vue chciałby mieć coś takiego jak this kropka attrs. No
to my nie moglibyśmy wtedy tutaj korzystać z attrs, dlatego wszystko co jest
specyficzne dla Vue jest poprzedzone dolarem i na przykład w metodach gdybyśmy
tutaj gdzieś mieli metodę, to moglibyśmy napisać this attrs i tak
dalej. Z części z tych rzeczy możemy i nawet powinniśmy w niektórych przypadkach korzystać,
także rzeczy specyficzne dla Vue są poprzedzone dolarem, inne nasze
dodane są jako gettery i settery tutaj przypisywane. Zatem zapamiętaj,
że jeżeli chcesz z czegoś korzystać w templatce teraz lub później, dlatego
że tutaj pewne rzeczy będą mogły być ładowane warunkowo, powinno to być już
na początku dodane w data. Nawet jeżeli miałby to być jakiś pusty string. Drugą z
rzeczy, którą chcę ci pokazać jest to, że Vue sobie opakowuje metody tablic. Bo
o ile settery działają w ten sposób, że jeżeli coś przypiszemy po znaku
równości to wywoła się nasza funkcja settera, o tyle jeżeli skorzystamy
z jakieś metody na przykład na tablicy, to już tak nie będzie, aby ci powiedzieć czy
pokazać o co mi chodzi, dodamy sobie metodę, którą
nazwiemy na przykład swap array, czyli podmień tablicę i ona
sprawi, że this items nadpiszemy nową tablicą
i tam powiedzmy, że będzie tylko jedna rzecz. Na przykład
mleko. Okej, czyli jeśli ją wywołamy, wszystko
zostanie podmienione, a więc wywoła się setter, czyli this items równa się nowa
tablica, wywoła się setter to się wszystko podmieni i tutaj powinno zostać również zmienione,
więc możemy się odwołać tutaj do tego, chociaż widzimy,
że jakiś pojawił się błąd. Tak to name powinniśmy tutaj usunąć. Okej,
odwołamy się do tego naszego vm0 i następnie
do swap array, wywołamy to, na stronie zostało to zmienione, czyli
tutaj nie ma żadnych nowości, ale teraz pokażę ci ciekawszą rzecz, bo się okazuje, że jeśli
się odwołamy do vm0 i następnie do items. Wiem,
że to jest tablica i nie będę jej nadpisywał w ten sposób, czyli setter
się nie wywoła, ale odwołam się do tej tablicy i dodam nowy element poprzez
push. Na przykład woda. Zobacz,
zostało to dodane do strony. To jest rzecz absolutnie kapitalna, jeżeli
już będziemy później tworzyć aplikacje. Możemy mieć formularz, w którym użytkownik coś wpisze
i dla nas tylko poprzez dodanie tego za pomocą push
do tablicy, którą mamy w data, wszystko od nowa się na stronie wyrenderuje. Jeśli
tutaj będzie pętla, o których się będziemy uczyć później zostanie dodany kolejny element. To
jest genialne, że tutaj mamy tak zwany single source of truth. Wszystko, co jest tutaj,
tylko tym manipulujemy. Wystarczy, że tutaj sobie coś dodam, strona
musi zostać tutaj odświeżona. To wszystko musi zostać odzwierciedlone. Natomiast
ja chciałbym ci tak troszeczkę z technicznego punktu widzenia to wytłumaczyć, no bo już
ci pokazałem jak działają settery. Mógłbyś się zastanawiać, w takim razie, czy
setter też się wywołuje kiedy na tablicy wykonamy metodę push. Okazuje
się, że nie. Po prostu Vue wiedząc, na początku przy inicjalizacji,
że items jest to tablica, opakowało sobie jej metody, czyli normalnie tablica
ma metodę push. Vue zastępuje to swoją metodą push, która później
wywoła oryginalną metodę żeby dodać coś do tablicy, ale przy okazji wywoła kod
odpowiedzialny za analizę, czy trzeba przerenderować widok czy nie. No
i teraz związku z tym pytanie. Jak myślisz jakie metody są te
tutaj opakowane? Wrzucę to może w takim komentarzu metoda
push, pop shift, unshift, splice, sort, reverse. Są to metody tablic
dostępne we EcmaScript5. Metod jest jeszcze więcej, ale to są te
które coś dodają do tablicy, modyfikując tą tablicę, bo mamy na przykład metodę filter
czy map. One zwracają nową tablicę, stąd nie są tutaj opakowane, ale
metody, które oryginalną tablice modyfikują zostały przez Vue opakowane, a więc z
wszystkich tych metod możesz korzystać, gdzieś wewnątrz tutaj swojego
kodu czyli moglibyśmy napisać na przykład add item i zrobilibyśmy
powiedzmy this items push i tutaj
zrobimy prompt do użytkownika. Podaj
produkt, okej i znowu
jeśli tę metodę wywołamy, czyli
będzie to add item. Okej,
znowu musimy tutaj zaznaczyć, jak widzisz, żeby nam to działało poprawnie. Wywoła nam się
Podaj produkt i będziemy mogli napisać na przykład Pepsi. Dodajemy to
do tablicy. Zostało odzwierciedlone na stronie, z wszystkich tych metod możesz bez problemu korzystać. Teraz
powiem ci o jeszcze jednej kapitalnej rzeczy, która znowu wpływa świetnie na optymalizacje. Jeżeli
nadpiszemy jedną tablicę inną tablicą, to Vue będzie potrafiło
te tablice porównać, czyli jeżeli byśmy sobie zrobili filter lub map. Wiemy,
że to zwraca nową tablicę. Powiedzmy, że tutaj będziemy chcieli zrobić
filter items i
powiedzmy, że this item
nadpiszemy nową tablicą. To co zrobiłem wcześniej w metodzie swap, ale nowa tablica
może być zwrócona z metody na przykład filter, czyli this items i powiedzmy,
że chcemy odfiltrować. Tutaj będziemy mieli
jeden element takiej tablicy, tylko te które powiedzmy zaczynają
się na s, czyli return i zwrócimy true or false, właśnie
z funkcji filtrującej. Jeżeli items.charAt 0, czyli
pierwszy znak równa się powiedzmy duże s i chciałbym tutaj dodać
sobie jeszcze coś, co będzie na duże S, czyli
Szampan, na przykład i teraz
spróbujemy sobie ją wywołać. Chyba znowu tutaj musimy kliknąć, znowu przejść w to miejsce
i zamiast add item zrobimy filter. Tutaj
moglibyśmy w zasadzie przekazywać parametr dynamicznie, ale to jest nieistotne. Okej,
a items is not defined. Tutaj musi być oczywiście
this, jeszcze raz kliknijmy, zróbmy
to samo, okej charAt of undefined, czyli
tutaj pojawił się jakiś błąd. Wychodzi na to,
że metoda filter będzie otrzymywać najpierw index. Okej, nie,
błąd. Przepraszam, nie tutaj this items tylko tutaj powinno być item,
okej. To jedno przekazane w to miejsce, czyli jeden z tych stringów, więc spróbujmy
raz jeszcze, okej i na stronie zostały tylko te,
które mają s na początku. Natomiast po co ci to pokazuje, bo okazuje
się, że Vue działa w taki sposób, że w momencie kiedy tablice, która tutaj
była napisaliśmy nową, bo co ważne metoda filter zwraca zupełnie nową tablicę. Tutaj
mógłbym ją przepisać ręcznie. Vue będzie miał setter, który się wywoła. W tym setterze sobie
sprawdzi, że jest to tablica i porówna elementy tablicy i okaże się, że
w nowo zwróconej tablicy dwa elementy są takie same, czyli
sok oraz szampan. Dzięki temu w tym przypadku wszystko
będzie renderowane od nowa, ale gdybyśmy tutaj mieli pętlę i w tej pętli byłby elementy
li renderowane i w każdym li wyobraź sobie, że byłby osobny element
to Vue będzie mogło zostawić 2 oryginalne elementy
li, w których był sok i szampan, czyli potrafi Vue nawet porównać
sobie dwie tablice. Jeśli jedną tablicę zastąpimy inną tablicą i te elementy, które
się nie zmieniły, które pozostały, będą mogły na stronie być niezmienione, co
jeszcze bardziej wpływa na wydajność właśnie tego rozwiązania.
Okej, zatem to tyle w tej lekcji. Mam nadzieję, że przedstawiając ci Vue od troszeczkę innej
strony, czyli takiej bardziej technicznej, jak to działa, będziesz mógł lepiej ten framework
rozumieć, czyli zapamiętaj z tej lekcji tyle, że jeżeli z czegoś chcesz w templatce korzystać
lub w metodach, powinno to być dodane od razu do data już na początku. Zapamiętaj, że Vue
opakowuje nam metody tablic, takie jak są tutaj i dzięki
temu jeśli z którejkolwiek skorzystamy jest odzwierciedlane na stronie, a jeżeli nadpiszemy
tablice inną tablicą, to są porównywane elementy, żeby nie wszystko
musiało być renderowane od nowa. Natomiast w związku z tym zapamiętaj jedną bardzo ważną
rzecz. Jeżeli tutaj jeszcze raz sobie przejdziemy i odwołamy
się do vm0 i następnie
do items. Mamy tą tablicę, wiesz że jeśli skorzystamy z push to zadziała. Jeśli
ją nadpisze nową tablicą, to zadziała. Ale jeśli bym zmienił jej długość,
zmieniając na przykład length, w ten sposób, na 2, to Vue
nie jest w stanie tego oddzielić, bo po prostu nie ma takiej technicznej możliwości w JavaScripcie,
aby Vue się o tym dowiedział. Jest to możliwe w EcmaScript6,
ale na przykład nie jest możliwe w ES5, na którym Vue bazuje. Podobnie
jeżeli byśmy się odwołali do items i na przykład pod indeksem drugim chcieli coś dodać,
powiedzmy Piotr, czyli będzie to trzeci element. Vue
nam na stronie tego nie zmieni, bo on nie wie, że taka zmiana miała miejsce, więc o tym
pamiętaj, dlatego powinniśmy albo nadpisywać całą tablicę albo
korzystać z metod takich jak push, pop shift i tak dalej. Wtedy
mamy pewność, że Vue dowie się o tych zmianach i będzie mógł je odzwierciedlić na stronie.