- Π‘ΡΠ²ΠΎΡΠ΅Π½ΠΈΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΡΠΉ
goit-react-hw-03-image-finder
- ΠΡΠΈ Π·Π΄Π°ΡΡ Π΄ΠΎΠΌΠ°ΡΠ½ΡΠΎΡ ΡΠΎΠ±ΠΎΡΠΈ Ρ ΠΏΠΎΡΠΈΠ»Π°Π½Π½Ρ: Π½Π° Π²ΠΈΡ
ΡΠ΄Π½Ρ ΡΠ°ΠΉΠ»ΠΈ ΡΠ° ΡΠΎΠ±ΠΎΡΡ ΡΡΠΎΡΡΠ½ΠΊΡ
ΠΏΡΠΎΠ΅ΠΊΡΡΠ² Π½Π°
GitHub Pages
. - Π£ ΡΡΠ°Π½Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡΠ² Π·Π±Π΅ΡΡΠ³Π°ΡΡΡΡΡ ΠΌΡΠ½ΡΠΌΠ°Π»ΡΠ½ΠΎ Π½Π΅ΠΎΠ±Ρ ΡΠ΄Π½ΠΈΠΉ Π½Π°Π±ΡΡ Π΄Π°Π½ΠΈΡ , ΡΠ΅ΡΡΠ° ΠΎΠ±ΡΠΈΡΠ»ΡΡΡΡΡΡ
- ΠΡΠ΄ ΡΠ°Ρ Π·Π°ΠΏΡΡΠΊΡ ΠΊΠΎΠ΄Ρ Π·Π°Π²Π΄Π°Π½Π½Ρ Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ Π²ΡΠ΄ΡΡΡΠ½Ρ ΠΏΠΎΠΌΠΈΠ»ΠΊΠΈ ΡΠ° ΠΏΠΎΠΏΠ΅ΡΠ΅Π΄ΠΆΠ΅Π½Π½Ρ.
- ΠΠ»Ρ ΠΊΠΎΠΆΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Ρ ΠΎΠΊΡΠ΅ΠΌΠ° ΠΏΠ°ΠΏΠΊΠ° Π· ΡΠ°ΠΉΠ»ΠΎΠΌ React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΡΠ° ΡΠ°ΠΉΠ»ΠΎΠΌ ΡΡΠΈΠ»ΡΠ²
- ΠΠ»Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡΠ² ΠΎΠΏΠΈΡΠ°Π½Ρ
propTypes
- ΠΡΠ΅, ΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΎΡΡΠΊΡΡ Ρ Π²ΠΈΠ³Π»ΡΠ΄Ρ ΠΏΡΠΎΠΏΡΡΠ², ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡΡ ΠΉΠΎΠΌΡ ΠΏΡΠ΄ ΡΠ°Ρ Π²ΠΈΠΊΠ»ΠΈΠΊΡ.
- ΠΠΌΠ΅Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡΠ² Π·ΡΠΎΠ·ΡΠΌΡΠ»Ρ ΡΠ° ΠΎΠΏΠΈΡΠΎΠ²Ρ
- JS-ΠΊΠΎΠ΄ ΡΠΈΡΡΠΈΠΉ Ρ Π·ΡΠΎΠ·ΡΠΌΡΠ»ΠΈΠΉ, Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΡΡΡΡΡ
Prettier
. - Π‘ΡΠΈΠ»ΡΠ·Π°ΡΡΡ Π²ΠΈΠΊΠΎΠ½Π°Π½Π°
CSS-ΠΌΠΎΠ΄ΡΠ»ΡΠΌΠΈ
Π°Π±ΠΎStyled Components
.
ΠΠ°ΠΏΠΈΡΠΈ Π·Π°ΡΡΠΎΡΡΠ½ΠΎΠΊ ΠΏΠΎΡΡΠΊΡ Π·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Ρ Π·Π° ΠΊΠ»ΡΡΠΎΠ²ΠΈΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ. ΠΡΠ΅Π²'Ρ ΡΠΎΠ±ΠΎΡΠΎΠ³ΠΎ Π·Π°ΡΡΠΎΡΡΠ½ΠΊΡ Π΄ΠΈΠ²ΠΈΡΡ Π·Π° ΠΏΠΎΡΠΈΠ»Π°Π½Π½ΡΠΌ.
Π‘ΡΠ²ΠΎΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ <Searchbar>
, <ImageGallery>
, <ImageGalleryItem>
,
<Loader>
, <Button>
Ρ <Modal>
. ΠΠΎΡΠΎΠ²Ρ ΡΡΠΈΠ»Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡΠ² ΠΌΠΎΠΆΠ½Π° Π²Π·ΡΡΠΈ Ρ ΡΠ°ΠΉΠ»Ρ
styles.css Ρ ΠΏΡΠ΄ΠΏΡΠ°Π²ΠΈΡΠΈ ΠΏΡΠ΄ ΡΠ΅Π±Π΅, ΡΠΊΡΠΎ ΠΏΠΎΡΡΡΠ±Π½ΠΎ.
ΠΠ»Ρ HTTP-Π·Π°ΠΏΠΈΡΡΠ² Π²ΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠΉ ΠΏΡΠ±Π»ΡΡΠ½ΠΈΠΉ ΡΠ΅ΡΠ²ΡΡ ΠΏΠΎΡΡΠΊΡ Π·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Ρ Pixabay. ΠΠ°ΡΠ΅ΡΡΡΡΡΠΉΡΡ ΡΠ° ΠΎΡΡΠΈΠΌΠ°ΠΉ ΠΏΡΠΈΠ²Π°ΡΠ½ΠΈΠΉ ΠΊΠ»ΡΡ Π΄ΠΎΡΡΡΠΏΡ.
URL-ΡΡΠ΄ΠΎΠΊ HTTP-Π·Π°ΠΏΠΈΡΡ.
https://pixabay.com/api/?q=cat&page=1&key=your_key&image_type=photo&orientation=horizontal&per_page=12
Pixabay API ΠΏΡΠ΄ΡΡΠΈΠΌΡΡ ΠΏΠ°Π³ΡΠ½Π°ΡΡΡ, Π·Π° Π·Π°ΠΌΠΎΠ²ΡΡΠ²Π°Π½Π½ΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ page
Π΄ΠΎΡΡΠ²Π½ΡΡ 1
.
ΠΠ΅Ρ
Π°ΠΉ Ρ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Ρ Π½Π°Π΄Ρ
ΠΎΠ΄ΠΈΡΡ ΠΏΠΎ 12 ΠΎΠ±'ΡΠΊΡΡΠ², Π²ΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ per_page
.
ΠΠ΅ Π·Π°Π±ΡΠ΄Ρ, ΡΠΎ ΠΏΡΠ΄ ΡΠ°Ρ ΠΏΠΎΡΡΠΊΡ Π·Π° Π½ΠΎΠ²ΠΈΠΌ ΠΊΠ»ΡΡΠΎΠ²ΠΈΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ, Π½Π΅ΠΎΠ±Ρ
ΡΠ΄Π½ΠΎ ΡΠΊΠΈΠ΄Π°ΡΠΈ
Π·Π½Π°ΡΠ΅Π½Π½Ρ page
Π΄ΠΎ 1
.
Π£ Π²ΡΠ΄ΠΏΠΎΠ²ΡΠ΄Ρ Π²ΡΠ΄ Π°ΠΏΡ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡ ΠΌΠ°ΡΠΈΠ² ΠΎΠ±'ΡΠΊΡΡΠ², Π² ΡΠΊΠΈΡ ΡΠΎΠ±Ρ ΡΡΠΊΠ°Π²Ρ Π»ΠΈΡΠ΅ Π½Π°ΡΡΡΠΏΠ½Ρ Π²Π»Π°ΡΡΠΈΠ²ΠΎΡΡΡ.
id
β ΡΠ½ΡΠΊΠ°Π»ΡΠ½ΠΈΠΉ ΡΠ΄Π΅Π½ΡΠΈΡΡΠΊΠ°ΡΠΎΡwebformatURL
β ΠΏΠΎΡΠΈΠ»Π°Π½Π½Ρ Π½Π° ΠΌΠ°Π»Π΅Π½ΡΠΊΠ΅ Π·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π½Ρ Π΄Π»Ρ ΡΠΏΠΈΡΠΊΡ ΠΊΠ°ΡΡΠΎΠΊlargeImageURL
β ΠΏΠΎΡΠΈΠ»Π°Π½Π½Ρ Π½Π° Π²Π΅Π»ΠΈΠΊΠ΅ Π·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π½Ρ Π΄Π»Ρ ΠΌΠΎΠ΄Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΊΠ½Π°
ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΏΡΠΈΠΉΠΌΠ°Ρ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΠΏ onSubmit
β ΡΡΠ½ΠΊΡΡΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π·Π½Π°ΡΠ΅Π½Π½Ρ ΡΠ½ΠΏΡΡΠ°
ΠΏΡΠ΄ ΡΠ°Ρ ΡΠ°Π±ΠΌΡΡΡ ΡΠΎΡΠΌΠΈ. Π‘ΡΠ²ΠΎΡΡΡ DOM-Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π½Π°ΡΡΡΠΏΠ½ΠΎΡ ΡΡΡΡΠΊΡΡΡΠΈ.
<header class="searchbar">
<form class="form">
<button type="submit" class="button">
<span class="button-label">Search</span>
</button>
<input
class="input"
type="text"
autocomplete="off"
autofocus
placeholder="Search images and photos"
/>
</form>
</header>
Π‘ΠΏΠΈΡΠΎΠΊ ΠΊΠ°ΡΡΠΎΠΊ Π·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Ρ. Π‘ΡΠ²ΠΎΡΡΡ DOM-Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π½Π°ΡΡΡΠΏΠ½ΠΎΡ ΡΡΡΡΠΊΡΡΡΠΈ.
<ul class="gallery">
<!-- ΠΠ°Π±ΡΡ <li> ΡΠ· Π·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π½ΡΠΌΠΈ -->
</ul>
ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠΏΠΈΡΠΊΡ ΡΠ· Π·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π½ΡΠΌ. Π‘ΡΠ²ΠΎΡΡΡ DOM-Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π½Π°ΡΡΡΠΏΠ½ΠΎΡ ΡΡΡΡΠΊΡΡΡΠΈ.
<li class="gallery-item">
<img src="" alt="" />
</li>
ΠΡΠΈ Π½Π°ΡΠΈΡΠΊΠ°Π½Π½Ρ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡ Load more
ΠΏΠΎΠ²ΠΈΠ½Π½Π° Π΄ΠΎΠ²Π°Π½ΡΠ°ΠΆΡΠ²Π°ΡΠΈΡΡ Π½Π°ΡΡΡΠΏΠ½Π° ΠΏΠΎΡΡΡΡ
Π·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Ρ Ρ ΡΠ΅Π½Π΄Π΅ΡΠΈΡΠΈΡΡ ΡΠ°Π·ΠΎΠΌ ΡΠ· ΠΏΠΎΠΏΠ΅ΡΠ΅Π΄Π½ΡΠΌΠΈ. ΠΠ½ΠΎΠΏΠΊΠ° ΠΏΠΎΠ²ΠΈΠ½Π½Π° ΡΠ΅Π½Π΄Π΅ΡΠΈΡΠΈΡΡ Π»ΠΈΡΠ΅
ΡΠΎΠ΄Ρ, ΠΊΠΎΠ»ΠΈ Ρ ΡΠΊΡΡΡ Π·Π°Π²Π°Π½ΡΠ°ΠΆΠ΅Π½Ρ Π·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π½Ρ. Π―ΠΊΡΠΎ ΠΌΠ°ΡΠΈΠ² Π·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Ρ ΠΏΠΎΡΠΎΠΆΠ½ΡΠΉ, ΠΊΠ½ΠΎΠΏΠΊΠ°
Π½Π΅ ΡΠ΅Π½Π΄Π΅ΡΠΈΡΡΡΡ.
ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠΏΡΠ½Π΅ΡΠ° Π²ΡΠ΄ΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡΡ, Π΄ΠΎΠΊΠΈ Π²ΡΠ΄Π±ΡΠ²Π°ΡΡΡΡΡ Π·Π°Π²Π°Π½ΡΠ°ΠΆΠ΅Π½Π½Ρ Π·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Ρ. ΠΠΈΠΊΠΎΡΠΈΡΡΠΎΠ²ΡΠΉΡΠ΅ Π±ΡΠ΄Ρ-ΡΠΊΠΈΠΉ Π³ΠΎΡΠΎΠ²ΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, Π½Π°ΠΏΡΠΈΠΊΠ»Π°Π΄ react-loader-spinner Π°Π±ΠΎ Π±ΡΠ΄Ρ-ΡΠΊΠΈΠΉ ΡΠ½ΡΠΈΠΉ.
ΠΡΠ΄ ΡΠ°Ρ ΠΊΠ»ΡΠΊΡ Π½Π° Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π³Π°Π»Π΅ΡΠ΅Ρ ΠΏΠΎΠ²ΠΈΠ½Π½ΠΎ Π²ΡΠ΄ΠΊΡΠΈΠ²Π°ΡΠΈΡΡ ΠΌΠΎΠ΄Π°Π»ΡΠ½Π΅ Π²ΡΠΊΠ½ΠΎ Π· ΡΠ΅ΠΌΠ½ΠΈΠΌ
ΠΎΠ²Π΅ΡΠ»Π΅ΡΠΌ Ρ Π²ΡΠ΄ΠΎΠ±ΡΠ°ΠΆΠ°ΡΠΈΡΡ Π²Π΅Π»ΠΈΠΊΠ° Π²Π΅ΡΡΡΡ Π·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π½Ρ. ΠΠΎΠ΄Π°Π»ΡΠ½Π΅ Π²ΡΠΊΠ½ΠΎ ΠΏΠΎΠ²ΠΈΠ½Π½ΠΎ
Π·Π°ΠΊΡΠΈΠ²Π°ΡΠΈΡΡ ΠΏΠΎ Π½Π°ΡΠΈΡΠΊΠ°Π½Π½Ρ ΠΊΠ»Π°Π²ΡΡΡ ESC
Π°Π±ΠΎ ΠΏΠΎ ΠΊΠ»ΡΠΊΡ Π½Π° ΠΎΠ²Π΅ΡΠ»Π΅Ρ.
ΠΠΎΠ²Π½ΡΡΠ½ΡΠΉ Π²ΠΈΠ³Π»ΡΠ΄ ΡΡ
ΠΎΠΆΠΈΠΉ Π½Π° ΡΡΠ½ΠΊΡΡΠΎΠ½Π°Π» ΡΡΠΎΠ³ΠΎ
VanillaJS-ΠΏΠ»Π°Π³ΡΠ½Π°, ΡΡΠ»ΡΠΊΠΈ Π·Π°ΠΌΡΡΡΡ
Π±ΡΠ»ΠΎΠ³ΠΎ ΠΌΠΎΠ΄Π°Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΊΠ½Π° ΡΠ΅Π½Π΄Π΅ΡΠΈΡΡΡΡ Π·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π½Ρ (Ρ ΠΏΡΠΈΠΊΠ»Π°Π΄Ρ Π½Π°ΡΠΈΡΠ½ΡΡΡ Run
).
ΠΠ½ΡΠΌΠ°ΡΡΡ ΡΠΎΠ±ΠΈΡΠΈ Π½Π΅ ΠΏΠΎΡΡΡΠ±Π½ΠΎ!
<div class="overlay">
<div class="modal">
<img src="" alt="" />
</div>
</div>
npm i axios
import axios from 'axios'
npm install @emotion/react @emotion/styled
import styled from '@emotion/styled'
npm i nanoid
import { nanoid } from 'nanoid'
npm i modern-normalize
import 'modern-normalize'
npm install react-loader-spinner --save
import { Audio } from 'react-loader-spinner'
npm i react-icons
import { BsSearch } from 'react-icons/bs';
npm i react-toastify
import { ToastContainer, toast } from 'react-toastify';
API key: '34523545-f21683fd59bfc3e4e2549fe07'