- Tworzymy aplikację poprzez
npx create-react-app warsawjs-workshop-20-flights-search
- Odpalamy ją za pomocą
npm start
- Stworzyć główny komponent
<App />
, który wyświetla „Hello World” wApp.js
import React from "react";
export default class App extends React.Component {
render() {
return (
<h1>Hello World!</h1>
);
}
}
- Wyrenderować
<App />
za pomocą react-dom (ReactDOM.render(<App />, document.getElementById("root")
) - Dodać bazowe cssy (
import "./index.css"
)
- Stworzyć komponent
<SearchView />
- Dodać w nim znacznik
form
- Dodać dwa znaczniki
select
: [Do, Z] z opcjamiWAW, ATL
- Dodać dwa znaczniki
input[type="date"]
Data wylotu, Data powrotu - Podpiąć pod nie metody zmieniające
state
na ich wartości
class SearchView extends React.Component {
onToChange = (e) => this.setState({ to: e.target.value });
render() {
return (
<div>
<input onChange={this.onToChange} />
</div>
)
}
}
- Ustalić wartość
inputów
na wartości zestate
<input onChange={this.onToChange} value={this.state.to} />
- Dodać
onSubmit
doform
(zwykłyconsole.log
state'a)
7.1 Dodać walidację pól (czy są wypełnione, czy data początkowa jest wcześniej niż data końcowa)
7.2 Ważne, aby pamiętać o zablokowaniu domyślnego zachowania formularza –evt.preventDefault()
- Stworzyć kolejny component
<FlightsView />
- W
<App />
renderować komponent w zależności od wartości state'u (view === "search"
czyview === "flights"
) - Dodać zmianę state'a w
<App />
(przekazanie metody jako prop do<SearchView />
; zmianastate.view
orazstate.searchData
) - Zrobić zapytanie do api (
https://warsawjs-flights-api.herokuapp.com/flights/:outboundDate/:inboundDate/:outboundAirport/:inboundAirport
) za pomocąfetch
wcomponentDidMount
i zapisać je do state'a - Wyświetlić dane w prosty sposób np.
render() {
return this.state.flights.map( flight => (<p>Price: ${flight.price}</p>);
}
- Stworzyć komponent
<Flight />
, który będzie wyświetlał: godzinę odlotu, godzinę przylotu, cenę lotu, lotnisko startowe, lotnisko końcowe, ilość przesiadek
- Dodajemy Material-UI –
npm install @material-ui/core @material-ui/icons --save
- W pliku
public/index.html
dodajemy<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500">
, - Dodajemy
AppBar
orazDrawer
– https://material-ui-next.com/demos/drawers/#clipped-under-the-app-bar - Zamieniamy
inputy
na te z Material-UI – https://material-ui-next.com/demos/text-fields/ - Zamieniamy
button
na ten z Material-UI – https://material-ui-next.com/demos/buttons/
- Tworzymy plik
withLoading.js
- Tworzymy funkcję
withLoading
, która wyświetla namLinearProgress
jeśli propisLoading === true
, w innym przypadku wyświetlamyComponent
- Stworzyć komponent
<FlightsFilter />
- Dodać 2
Input[type="number]
– jeden dla minimalnej ceny, drugi dla maksymalnej - Tworzymy metodę
updateStateField
, która będzie zmieniać nasz stan - Filtrowanie lotów – podanie jako prop metody
filterFlights
do<FlightsFilter />
, która przy wykonaniu filtruje loty i przypisuje je do state'u<FlightsView />
- Stworzyć filtrowanie po cenie
- Dodać wywołanie tej metody na
onChange
inputa - Dodać
Switch
- Dodać filtrowanie tylko jeśli checkbox jest zaznaczony
- Pobieranie lotnisk z api
- Wyświetlanie linii lotniczych (pobranie ich z api)
- Filtrowanie po innych wartościach
- Wyświetlanie (ilości) przesiadek
- Sortowanie (po cenie, długości podróży)
- Ustawianie wartości pól w
<SeachView />
po powrocie do tego widoku - Dodanie chowanego menu bocznego
- API: https://warsawjs-flights-api.herokuapp.com/
- Chowane menu boczne: https://codesandbox.io/s/947n8o192p