Instalirati NodeJS i NPM https://nodejs.org/en/
Provjeriti radi li NPM u terminalu (command prompt-u)
npm -v
Mora vratiti neku verziju, npr "7.18.1".
U terminalu otvoriti (navigirati) do datoteke cd naziv-datoteke
i pokrenuti
npm install
U terminalu otvoriti (navigirati) do datoteke cd naziv-datoteke
i pokrenuti
npm run start
-
Preuzeti datoteku sa repozitorija (download zip), instalirati i pokrenuti projekt
-
Napraviti sljedeće komponente u
src/components
folderu:
- SearchForm - za formu (input i button)
- CollectionTable - za tablicu sa podacima. Tablica mora imati
thead
satr
ith
zaglavljima itbody
.tr
itd
markup će se nalaziti uTableItem
komponenti. - TableItem - jedan podatkovni redak tablice (tr u tbody elementu)
- Pagination - paginacija (previous i next button i trenutni page)
-
Dodati HTML markup za komponente
-
Pozvati komponente u src/App.js
-
U
src/App.js
je importandata
izsrc/data.json
kojeg danas koristite kao placeholder podatke. Sutra radimo API integraciju. -
Prosljediti placeholder podatke komponentama putem props-a.
SearchForm - prima standardni React "children" prop koji će sadržavati rezultat pretraživanja. U suprotnom će ispisati "No results".
CollectionTable - prima standardni React "children" prop koji će sadržavati podatkovne retke koji se iterativno pozivaju ovisno o releases
array-u podataka iz data.json
datoteke.
TableItem - prima propove za prikaz podataka iz releases
array-a data.json
datoteke.
Pagination - prima propove za prikaz podataka iz pagination
objekta data.json
datoteke. Potrebni su pages
koji sadrži ukupan broj pageva i page
koji sadrži podatak koji je trenutni page.
- Dodati stilove u
src/index.css
da aplikacija izgleda što bliže screenshotu ili proizvoljno
-
U
public/index.html
promjeniti <title> vrijednost na vaše ime i prezime i naziv projekta -
U
public/index.html
dodati element sa CSS linkom nanormalize.css
koji služi za izjednačavanje stilova između browsera. Ukoliko je dobro dodan, font u projektu bi se trebao promjeniti na Arial. https://cdnjs.com/libraries/normalize
Dovršeni zadatak 1. dana: https://react-akademija-app-1.netlify.app/
Statičke komponente sa prosljeđenim propovima. Trenutno nema funkcionalnosti.
Tablice https://www.w3schools.com/html/html_tables.asp
Input https://www.w3schools.com/tags/tag_input.asp
Button https://www.w3schools.com/tags/tag_button.asp
Prijedlog strukture App
komponente sa komponentama
return (
<div>
<header>
{/* Dopuniti sa odgovarajućim HTML markupom i tekstom */>}
</header>
<SearchForm>{/* Dopuniti sa propsima */>}</SearchForm>
<CollectionTable>
{/* Dopuniti da se iterativno stvaraju TableItem komponente */>}
<TableItem {/* Dopuniti sa propsima */>} />
</CollectionTable>
<Pagination {/* Dopuniti sa propsima */>} />
</div>
);
Paginacija prima vrijednosti trenutnog pagea i ukupni broj pageva kao prop. Prosljediti hard-codane placeholder propove za sada.
Paginacija ispisuje trenuti page u Current page:
tekstu između 2 buttona
Ukoliko je trenutni page 1, Postaviti “disabled” atribut na “Previous” button HTML elementa na true
. U suprotnom na false
.
Ukoliko je trenutni page jednak ukupnom broju pageva, napraviti isto za Next
button HTML element
API URL: https://api.discogs.com/database/search?q=${query}&key=OxnCHJEetGbikaamOyaK&secret=wQCIuWuanmRVVeWqNVFWMfSJldHbqnAi
query
je varijabla teksta forme koji treba predati preko state-a
Na button click poslati query na API i ispisati samo prvi rezultat responsea. Prvi rezultat iz data
response-a se može dohvatiti ovako:
Boolean(data.results.length) ? data.results[0].title : "No results"
Funkciju za submit i state treba napraviti u App.js
-u. SearchForm
komponenti predati rezultat pretraživanja preko children
prop-a. Prosljediti nove propove za: promjenu input statea za query (onChange na input), trenutni query state (value na input) i funkciju za pretraživanje (onClick na button)
Podatke za tablicu dohvatiti sa API-ja (obrisati import json datoteke iz App.js).
https://api.discogs.com/users/adrianmusiccollector/collection/folders/0/releases?page=${currentPage}
currentPage
- varijabla čija je početna vrijednost 1 i ona se može promjeniti preko paginacije
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch https://reactjs.org/docs/hooks-state.html https://reactjs.org/docs/hooks-effect.html
Dovršeni zadatak 2. dana: https://react-akademija-app-2.netlify.app/
Search vraća rezultat, podaci tablice se promjene klikom na next i previous button elemente
API vraća dva objekta:
pagination
- podatke za paginaciju (ukupan broj pageva, trenutni page, itd.)
collection
- array podataka za tablicu za trenutni page.
Paginacijom postavljati state koji je trenutni page odabran i dohvaćati nove rezultate tablice Ukoliko na API šaljete puno requestova, pričekajte minutu da prođe ograničenje ili mi se javite.
Pripazite da imate dependency array u useEffect
-u koji treba biti []
dok ne implementirate paginaciju, a onda treba ovisiti o odabranom pageu koji je sačuvan u state-u.
Možete imati i do 4 useState poziva, ovisno kako strukturirate state. Preporučujem za početak da imate odvojeni state dok se ne uvježbate.
- searchQuery - tekst koji se pretražuje
- searchResult - rezultat pretraživanja
- currentPage - odabrani page iz paginacije (početno stanje je 1)
- data - paginacija i collection array podataka
Koristite samo 1 useEffect sa dependency arrayom. Dohvaćanje podatka kolekcije (paginacija + collection) kada se aplikacija mounta i kada se currentPage promjeni.
Imate definiran search button handler funkciju - poziva API za pretraživanje.
Prijedlog useEffect
i submit funkcije u App.js
-u
/* Dohvaćanje kolekcije */
useEffect(() => {
fetch(`https://api.discogs.com/users/adrianmusiccollector/collection/folders/0/releases?page=${currentPage}`)
/* Dohvaćanje API URL-a sa prosljeđenom paginacijom */
.then((data) => data.json())
.then((data) => {
/* Dopuniti sa state update funkcijom */
});
}, [currentPage]);
const handleSearch = (event) => {
event.preventDefault();
fetch(
`https://api.discogs.com/database/search?q=${query}&key=OxnCHJEetGbikaamOyaK&secret=wQCIuWuanmRVVeWqNVFWMfSJldHbqnAi`
)
.then((data) => data.json())
.then((data) => {
setQueryResult(
Boolean(data.results.length) ? data.results[0].title : "No results"
);
});
};