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 przypisywać referencje do
elementów z obiektowego modelu dokumentu po to, abyśmy się mogli do
nich odwoływać w naszej aplikacji Vue i przy okazji pokażę ci
pewien problem, który będzie rozwiązany przez kolejną rzecz, którą poznasz
o Vue, w lekcji kolejnej. Natomiast chciałbym ci to pokazać, żebyś po prostu lepiej
to zrozumiał, więc mamy taki oto formularz i teraz chciałbym zrobić tak,
że jak tutaj wpiszę sobie jakieś dane i kliknę wyślij, to te dane zostaną tutaj
wyświetlane jako twoje dane. Teraz to wygląda tak, że twoje
dane wyświetlam tutaj jako full name, a to full name, jak widzisz jest puste i
teraz chciałbym po kliknięciu przycisku, kiedy przechwycimy
zdarzenie submit, wywołać metodę submit. Ona jest tutaj
i w niej chciałbym się móc odwołać do pola input, które jest
tutaj i do tego pola input. Pytanie, jak to zrobić, ciekawa
wiadomość jest taka, że Vue pozwala ci przepisywać do dowolnego elementu atrybut ref. Nie bindujemy go w
żaden sposób, po prostu go przypisujemy przekazując mu nazwę. Możesz ją dowolnie
tutaj sobie wstawić, jaką tylko chcesz, napisz my first name i last
name i jeżeli zrobisz coś takiego, bardzo ważna rzecz. Odświeżmy, jeżeli
przejdziemy tutaj do wm0 i zrobimy console.dir,
chociaż w zasadzie nie musimy robić console.dir, od razu się odwołajmy do vm0 dollar,
czyli wiemy, że jest taka rzecz specyficzna dla Vue i mamy coś takiego jak
refs, to będzie to obiekt, w którym będziemy mieli first name i last name. Dokładnie
to, co podaliśmy tutaj, jako te nazwy. Jako wartość pod taką właściwością
będzie odwołanie do elementu z drzewa DOM, normalnie dokładnie tak
samo jak byśmy go wyszukali za pomocą query selector lub jeżeli go tutaj kliknę
i mam dolar zero taką zmienną w przeglądarce. Jak
widzisz dokładnie tak samo to wygląda, czyli to jest natywny element i
teraz na tym natywnym elemencie mogę się odwołać do value, więc mając coś takiego,
moglibyśmy zrobić na submit, coś takiego, że będziemy robić
this full name i tę wartość, ona jest reaktywna. Jeżeli ją ustawimy,
to na stronie będzie odzwierciedlona, moglibyśmy ustawić na this, refs, first
name i połączyć to oczywiście z this refs,
last name. Okej, zobaczymy.
Jeżeli tutaj coś sobie wpiszę i spróbuję
wysłać, jak widzisz pojawiło się to tutaj, ale mamy
reprezentacje taką, bo first name i last name to są elementy input, więc
muszę value z nich zczytać oczywiście, ich właściwości value. Zobaczmy
raz jeszcze i mamy to teraz
tutaj. Natomiast nie jest to najlepszy sposób na to, żeby z pól input
zczytować wartości value. W kolejnej lekcji zobaczysz
jak zrobić to lepiej, ale ja jeszcze w tej lekcji pokażę ci lepsze użycia dla ref. Natomiast
od razu ci powiem że ref nie są reaktywne, czyli nie
jesteś w stanie zrobić sobie czego takiego, że dodasz computed full
name i gdybyś
tutaj chciał zwracać, return. Coś
takiego, tutaj full name wtedy byśmy musieli usunąć, okej. No
i tutaj jeszcze to przypisanie, byśmy usunęli. Wydawałoby się, że
to nam zadziała. Natomiast jak widzisz pojawia się
problem. Po pierwsze dlatego, że w momencie kiedy to computed jest
tworzone, to jeszcze nie są utworzone te referencje
do drzewa DOM, bo pokazywałem ci lifecycle diagram i to nie
bez powodu, warto sobie teraz do tego sięgnąć warto o tym pomyśleć.
Mianowicie kiedy jest można instancja to nie ma ona jeszcze dostępu
do drzewa DOM, dopiero kiedy wywoła się zderzeniem mounted, jak być może pamiętasz,
to dopiero wtedy to co jest w drzewie DOM, jest
dla nas dostępne, więc z tego powodu nam to nie zadziała, ale nawet gdybyśmy to obeszli
i tutaj sprawdzili sobie if. Na przykład this
is mounted, oczywiście coś takiego
nie istnieje, ale już ci spieszę z wyjaśnieniem. Moglibyśmy to zrobić w
ten sposób. Jeżeli this is mounted ma wartość true, to
moglibyśmy dodać sobie is mounted na false, a w
tym zdarzeniu, które ci pokazywałem, które się nazywa właśnie mounted. Moglibyśmy this
is mounted ustawić na true, czyli zrobilibyśmy swego rodzaju obejście,
żeby tego problemu nie było, kiedy będzie zamontowana ta instancja już do drzewa DOM,
to refs będzie dostępne. Wydawałoby się, że powinno to zadziałać, ale
jak widzisz nie działa w sposób reaktywny, nie jest tutaj wstawiane, więc warto
zapamiętać, że refs nie są reaktywne w żaden sposób. Jeżeli w
nich się coś zmieni, tutaj w value, nie jest to żaden sposób odzwierciedlane. Warto
o tym pamiętać i z tego powodu nam to nie będzie działać, ale ja to zostawię tak
w tym chodzi żebyś mógł sobie do tego zerknąć. Natomiast teraz chciałbym ci jeszcze pokazać na
koniec, jakie będzie poprawne użycie takich ref'ów, do czego one się
mogą przydać. Utworzymy sobie nową instancje Vue, bo oczywiście można to
robić chociaż jeszcze tego nie robiliśmy. Ja będę chciał wkleić fragment kodu
tutaj z odtwarzaczem,
już ci pokażę na czym sprawa polega. Okej,
tutaj pojawił się błąd, zaraz do tego przejdziemy, ale mamy jakieś wideo i po kliknięciu
na przycisk, tutaj będę chciał
wywołać metodę play pause, ta metoda nie istnieje i ważne
jest to, w ogóle może wytniemy to z tego miejsca i wstawmy poza app, żeby Vue tego
nie kontrolowało. App kończy się w tym miejscu, wstawimy to tutaj. Teraz
tego błędu nie będzie, bo jest to fragment zupełnie nie kontrolowany przez Vue i dodamy
sobie po prostu nową instancje. Nikt nie powiedział, że nie możemy tego zrobić, new vue
i tutaj el podajmy sobie player, czyli ta instancja
będziemy kontrolować wyłącznie tego playera i pozwól, że resztę kodu
tutaj wkleję, jeżeli będziesz chciał sobie go przećwiczyć to będziesz mógł go przepisać,
okej, data
is playing to jest false i mamy metody play, pause. No właśnie i
teraz ważna rzecz, którą zrobiłem tutaj. Konkretnie do elementu video przepisałem
ref, właśnie z wartością video. To mi pozwoli się odwołać
do tego elementu, a ważne jest to, że w przeglądarce, jeżeli mamy taki element,
teraz jeśli to odświeżę to będzie działać. Czyli mam to video pod dolar zero
to mogę na nim wywołać metodę play i to
wszystko się odtwarza, metoda pause, zatrzyma mi odtwarzanie
tego filmu, więc to natywnie po prostu tak działa w przeglądarce i to jest świetny
moment, żeby użyć ref'a. W momencie kiedy kliknę na ten przycisk, chcę wywołać
metodę play, pause i też ustawić tekst z tego przycisku za pomocą v-text,
jeżeli jest odtwarzanie, to chcę ustawić na pause, jeżeli nie
to na play. Metoda play, pause jest bardzo prosta. Ona się odwoła to this refs
video, czyli konkretnie do tego elementu. Zapiszę go sobie w zmiennej i sprawdzę,
jeżeli on jest z otrzymanych, chcę go odtworzyć isPlaying ustawić na true, w przeciwnym
wypadku zatrzymać. To jest bardzo dobre użycie dla
ref, czyli potrzebowałem odwołanie do tego elementu, bo jest to jedyny sposób w
jaki mogę odtwarzać wideo w przeglądarce i zobaczymy w jaki sposób to działa.
Jeżeli kliknę play, video jest odtwarzane, tekst się zmienił, klikam pause,
video jest zatrzymywane, więc zapamiętaj w tym momencie, że jeżeli
będziesz chciał pobierać wartości pól formularza to nato będziemy mieli lepsze rozwiązanie
natomiast. Natomiast ref sprawdzi się świetnie wszędzie tam, gdzie Vue nie oferuje
ci rozwiązania, które jest ci potrzebne, aby odwołać się w jakiś sposób do elementu
bezpośrednio z drzewa DOM.