Warsztat Vue.js
To jest repozytorium na potrzeby warsztatów Vue.js, które prowadzę.
npm install
npm run serve
Więcej w package.json
.
cd server
npm install
npm start
Staraj się nie robić zadań do przodu. Na każdą linijkę każdego punktu poniższej listy został przewidziany odpowiednio długi czas i moment podczas warsztatów. Poniższa lista jest raczej po to, aby ułatwić Ci przypomnienie sobie, co masz zrobić.
- To jest początkowy stan aplikacji, zapoznaj się z nią.
- Dodaj pole
appName
do data i wyświetl w navbarze używając{{ wąswów }}
. Spróbuj użyć wyrażenia, aby dodać coś do tekstu.
Dodaj polepage
do data i użyj zdarzenia z podpiętą metodą na przyciusku aby zwiększyć jego wartość.
Zmniejszanie wartości zrób inlineowo, w szablonie.
Użyj modyfikatora.prevent
aby zapobiedz przekierowaniu na kliknięcie. - Dodaj pole
product
do data, możesz je skopiować zsnippets/products.json
.
Wyświetl te pola na jego podstawie:name, photo, description, price, department
.
Dodajv-model
do następujących pól:name, photo, description, price, inStock, color
.
Dodajv-model
domaterials
, możesz użyćmaterials-v-model.html
żeby nie pisać tak dużo.
Dodajv-model
dodepartment
.
Dodaj modyfikatory:number
doprice
iinStock
trim
doname
,color
iphoto
lazy
dophoto
- Dodaj
v-if
do wyświetlaniainStock
opisowo - out of stock / few in stock / plenty in stock
Dodajspan.lozenge
z tekstem "free shipping" gdyprice
jest < $20.
Schowaj stopkę produktu i wyświetlspan.lozenge
"out of stock" gdyquantity
== 0.
Zamień "free shipping" na v-show. - Użyj range
v-for
do wyświetlenia większej ilości produktów.
Wyświetl licznik przed nazwą produktu
Użyj operatora?:
aby zapenić, żepage
>= 0 - Wyświetl pole
materials
w pętliv-for
.
Dodaj poleproducts
do data, znajdziesz je wsnippets/products.json
.
Wyświetl produktu na podstawie tego pola zamiastv-for
. - Dodaj klasę
highlight
do produktu gdyprice
< 300.
Podepnijstyle
pod kolory. - Zamiast
v-if
użyj metodydescribeQuantity
aby zwrócić teskt opisującyinStock
.
Zamień metodę na computed propery -quantityDescription
.
Zamieńproduct
tak, żeby był pobierany z tablicy lub był pustym obiektem gdy ta jest pusta. - Przenieś obsługę zdarzenia kliknięcia poprzedniej strony do metody
onClickPrevious
Dodajwatch
polapage
i pobieraj produkty dla zadanej strony za pomocąfetchProducts
z serwisu gdy się zmienia.
Wydziel pobieranie do metodyreloadProducts
i użyj jej zarówno wwatch
, jak icreated
.
Dodaj poleisLoading
i użyj go, żeby pokazać i chować.spinner
w zależności od stanu ładowania. - Dodaj globalny filtr
asCurrency
i użyj go w komponencie. - Dodaj globalną dyrektywę
style-when-broken
i użyj jej na obrazkach. Powinna ona dodawać klasębroken-image
do obrazka naonerror
jego ładowania. - Wydziel navbar do osobnego komponetu - pamiętaj o przeniesieniu
data
oraz wyekstraktowaniu styli zestyle.scss
. - Wydziel listę produktów do komponentu
ProductsList
przekazując mu wszystko, czego potrzebuje jako propsy.
Wydziel pojedyńczy element list do komponentuProductsListItem
przekazując mu produkt jako props.
Wydziel szczegóły produktu do komponentuProductDetails
przekazując mu produkt jako props z domyślną wartością będącą pustym obiektem. Pamiętaj o przeniesieniuquantityDescription
.
Przenieś odpowiednie style do nowych komponentów. - Zainstaluj
vuelidate
i użyj go w aplikacji - najpierwimport
, a potemVue.use
Wydziel komponentProductForm
i przekaż muproduct
jako propsa. Pamiętaj o stylach.
W funkcji data skopiuj każde pole produktu do pola komponentu - kod znajdziesz wsnippets/product-form.js
.
Dodaj również watcher naproduct
i skopiuj w nim dane do formularza edycji - kod znajdziesz wsnippets/product-form.js
.
Zaimportuj validatoryrequired
oraznumeric
zvuelidate/lib/validators
.
Dodaj jako pole obiektvalidators
, którego kluczami są nazwy pól danych, a wartościami obiekty z validatorami - kod znajdziesz wsnippets/product-form.js
.
Do każdego pola dodaj handler change lub input$v.nazwaPola.$touch()
- dla materials znajdziesz kod wsnippets/materials-v-model.html
.
Status formularza jest dostępny w$v.$invalid
. Użyj tego, aby pokazać.lozenge
z informacją o błędach w formularzu i wyłączyć przycisk. - Zainstaluj
vue-router
i użyj go w aplikacji - najpierwimport
, a potemVue.use
.
Dodaj do aplikacji prosty router mapujący/
naProductsList
.
WApp
wyświetlrouter-view
i usuń pozostałe komponenty oprócz navbara.
Całą logikę i pola przenieś doProductsList
. Pamiętaj, aby eventy zmienić na metody itp.
Dodajrouter-link
w navbarze. - Dodaj routey dla podglądu i edycji produktu przyjmujące parametr
id
.
Przekażid
za pomocą propsów - skonwertuj string na liczbę.
WProductsListItem
dodajrouter-link
do nowego urla
WProductDetails
dodaj pobieranie danych za pomocągetProductById
z serwisu. Obsłuż przypadki, gdy produkt się ładuje (flagaisLoading
+.spinner
) oraz gdy wystąpi błąd ładowania danych (flagaisError
+.lozenge
i tekst). Pamiętaj o tym, aby odświeżać dane również, gdyid
się zmieni.
WProductDetails
dodajrouter-link
do nowego urla
WProductForm
dodaj pobieranie danych za pomocągetProductById
z serwisu. Obsłuż przypadki, gdy produkt się ładuje (flagaisLoading
+.spinner
) oraz gdy wystąpi błąd ładowania danych (flagaisError
+.lozenge
i tekst). Pamiętaj o tym, aby odświeżać dane również, gdyid
się zmieni i ponownie kopiować pola produktu. - W
ProductsList
pobieraj numer strony z query stringa (page
). Przekazuj go jako props z routera, konwertując do liczby z wartością domyślną 1.
Linki stronicowania zamień narouter-link
i zamieńto
na notację obiektową, chowaj je gdy strona jest ostatnia lub pierwsza
Pokaż listę tylko jeśli zawiera elmenty, w innym wypadku wyświetl komunikat o pustej stronie. - Dodaj metodę
saveProduct
doProductForm
, która wyśle produkt na serwer z pomocąupdateProduct
z serwisu. Obsłuż błądsaveError
.
Po udanym zapisie przekieruj naProductDetails
z pomocąthis.$router
. - Zainstaluj
vuex
.
Stwórz prostystore
, który w stanie przechowujeproducts
i ma getter do ich pobrania oraz akcję + mutację do ich zmiany -updateProducts
.
UżyjmapGetters
imapActions
wProductsList
aby pobierać informacje tego stora. - Zainstaluj
vue-router-sync
i zsynchronizuj nim store i router za pomocą funkcjisync
.
Dodaj gettercurrentPageNumber
i użyj go zamiast propsa w komponencieProductsList
- Dodaj akcję
fetchProducts
do stora, a do stanu obiektproductsStatus
z flagamierror
iloading
.
Użyj akcji zamiast metody wProductsList
.
Stan ładowania i błędu również pobierz ze stora. - Do stora dodaj getter
currentProductId
pobierający liczbę z routera.
Dodaj gettercurrentProduct
, który zwraca znaleziony wproducts
element z tym samym id.
Dodaj mutacjęupdateOrAddProduct
, która albo zaktualizuje istniejący w tablicy produkt, albo doda nowy na jej końcu. Dodaj taką samą akcję.
Dodaj pole + gettercurrentProductStatus
oraz mutacjęchangeCurrentProductStatus
.
Dodaj akcjęfetchCurrentProduct
, która pobierze produkt i wywołaupdateOrAddProduct
dbając przy tym o 'currentProductStatus'.
Użyj nowych elementów stora wProductDetails
, usuwając przy tym propsy. - Dodaj akcję
saveProduct
oraz polesaveProductStatus
wraz z odpowiednim getterem i mutacją.
Użyj nowej akcji wProductForm
zmieniając metodę nasubmit
.
Przekierowanie obsłuż za pomocą zwróconego promisa. W środkuthen
możesz sprawdzić status formularza. - Stwórz plik
ProductsListItem/ProductsListItem.js
oraz 'ProductsListItem/ProductsListItem.scss'.
Style zProductsListItem.vue
przenieś do pliku scss, skrypt doProductsListItem.js
.
Dodaj polefunctional
o wartościtrue
.
Dodajrender
z parametermh
i obiektemcontext
jako drugim.
Skonwertuj template na JSX -v-if
zamień na:?
, a wszystkie odniesienia do zmiennych poprzedźcontext.props
.
Podwójne wąsy zamień na pojedyńcze.
Pomiń użycie filtra asCurrency, dodamy go potem.
Zmień wszystkie dynamicznie bindowane atrybuty na wywołania JSX atrybut={zmienne}. - Definicję dyrektywy i filtru wydziel do osobnych plików w odpowiednich folderach.
Ze stora wyeksportuj również sam obiekt opcji.
Router wydziel do osobnego pliku, domyślnie eksportując gotowy obiekt, ale również same opcje. - Zobacz jakie testy są dostępne w katalogu test, uruchom je i popraw jeśli to konieczne.
Dodaj testy poszczególnych elementów aplikacji - mutacji, getterów, akcji, komponentów.