html
React рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛: рдПрдХ рд╡реНрдпрд╛рдкрдХ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛
рд╡рд┐рд╖рдп рд╕реВрдЪреА
- рдкрд░рд┐рдЪрдп
- рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрдЕрдк рдХрд░рдирд╛
- рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рд▓рд╛рдЧреВ рдХрд░рдирд╛
- рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдХреЛ рдмрдврд╝рд╛рдирд╛
- рдЕрдкрд▓реЛрдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛
- рдирд┐рд╖реНрдХрд░реНрд╖
- рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрди
рдкрд░рд┐рдЪрдп
рдЖрдзреБрдирд┐рдХ рд╡реЗрдм рд╡рд┐рдХрд╛рд╕ рдкрд░рд┐рджреГрд╢реНрдп рдореЗрдВ, рдирд┐рд░реНрдмрд╛рдз рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдирд╛ рдЕрддреНрдпрдВрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реБрд╡рд┐рдзрд╛ рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдЬреИрд╕реА рджреГрд╢реНрдп рдкреНрд░рддрд┐рдкреБрд╖реНрдЯрд┐ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдХреЛ рдХрд╛рдлреА рд╣рдж рддрдХ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ React рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рддреА рд╣реИ, рдЬреЛ рджреЛрдиреЛрдВ рд╣реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреА рд╣реИред
рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХреНрдпреЛрдВ?
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╣рднрд╛рдЧрд┐рддрд╛: рдЕрдкрд▓реЛрдб рдХреЗ рджреМрд░рд╛рди рджреГрд╢реНрдп рдкреНрд░рддрд┐рдкреБрд╖реНрдЯрд┐ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЕрдирд┐рд╢реНрдЪрд┐рддрддрд╛ рдХрдо рд╣реЛрддреА рд╣реИред
- рдкреЗрд╢реЗрд╡рд░рддрд╛: рдПрдХ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЕрдкрд▓реЛрдб рдлреАрдЪрд░ рдЖрдкрдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред
- рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛: рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХреЛ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдВрднрд╛рд▓рдирд╛ рдЙрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдЬрдирд┐рдд рд╕рд╛рдордЧреНрд░реА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдХрд╛ рдЕрд╡рд▓реЛрдХрди
рдпрд╣ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЗ рдЬрд╛рдПрдЧреА:
- рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ React рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрдЕрдк рдХрд░рдирд╛ред
- рдЕрдкрд▓реЛрдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ред
- рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдХреЛ рдмрдврд╝рд╛рдирд╛ред
- рдЕрдкрдиреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдордЬрдмреВрддреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ред
рдЗрд╕ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдХреЗ рдЕрдВрдд рддрдХ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рдлреАрдЪрд░ рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рд╕реНрдореВрде рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рд╢реБрд░реБрдЖрддреА рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рдЬреНрдЮрд╛рди рд╡рд╛рд▓реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИред
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрдЕрдк рдХрд░рдирд╛
рдХреЛрдб рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХрд╛ React рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕реЗрдЯрдЕрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдорд╛рдирддреА рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ react-router-dom рдФрд░ axios рдЬреИрд╕реА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ React рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рд░рдВрднрд┐рдХреАрдХреГрдд рд╣реИ, рдЬреЛ рдХреНрд░рдорд╢рдГ рд░рд╛рдЙрдЯрд┐рдВрдЧ рдФрд░ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВред
рдЖрд╡рд╢реНрдпрдХ рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛
1 |
npm install react-router-dom axios |
рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рд▓рд╛рдЧреВ рдХрд░рдирд╛
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдордЭрдирд╛
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдВрд░рдЪрдирд╛ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА рдФрд░ рдореЗрдВрдЯреЗрдирдмрд┐рд▓рд┐рдЯреА рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреА рд╣реИред рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдЖрд╡рд╢реНрдпрдХ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЕрд╡рд▓реЛрдХрди рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
|
- client.js: HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред
- albumUpload.js: рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рдЗрдВрдЯрд░рдлреЗрд╕ рдФрд░ рд▓реЙрдЬрд┐рдХ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
- Loader.js: рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
- App.js: рд╡рд┐рднрд┐рдиреНрди рдкреЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд╛рдЙрдЯрд┐рдВрдЧ рд╕реЗрдЯрдЕрдк рдХрд░рддрд╛ рд╣реИред
рдПрд▓рдмрдо рдЕрдкрд▓реЛрдб рдХрдВрдкреЛрдиреЗрдВрдЯ рдореЗрдВ рд╕рдВрд╢реЛрдзрди
albumUpload.js рдХрдВрдкреЛрдиреЗрдВрдЯ рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╣рдо рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЧрдП рдкреНрд░рдореБрдЦ рд╕рдВрд╢реЛрдзрдиреЛрдВ рд╕реЗ рдЧреБрдЬрд░реЗрдВрдЧреЗред
рдЪрд░рдг 1: рдЖрд╡рд╢реНрдпрдХ рд╣реБрдХреНрд╕ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдЖрдпрд╛рдд рдХрд░рдирд╛
1 2 3 4 |
import React, { useState } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; import fetchPostFileUploadWithAuth from '../client/client'; import Loader from '../components/Loader'; |
рдЪрд░рдг 2: URL рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рд╕реЗ ID рдкрдврд╝рдирд╛
рд╡рд┐рднрд┐рдиреНрди рдПрд▓рдмрдореЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрд▓реЛрдб рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ URL рд╕реЗ ID рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
1 2 3 4 |
const location = useLocation(); const navigate = useNavigate(); const queryParams = new URLSearchParams(location.search); const albumId = queryParams.get('ID'); |
рдЪрд░рдг 3: рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЗрдЯ рд╕реЗрдЯ рдЕрдк рдХрд░рдирд╛
рд╣рдо React рдХреЗ useState рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕реНрдЯреЗрдЯ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдкрд▓реЛрдб рдмрдЯрди рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдпрд╛ рд▓реЛрдбрд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рдиред
1 |
const [processing, setProcessing] = useState(false); |
рдЪрд░рдг 4: рдЕрдкрд▓реЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
const handleUpload = async (event) => { setProcessing(true); const formData = new FormData(); Array.from(event.target.files).forEach(file => { formData.append('photos', file); }); try { const response = await fetchPostFileUploadWithAuth(`/albums/${albumId}/photo-upload`, formData); console.log(response.data); navigate(`/albums/show?ID=${albumId}`); } catch (error) { console.error('Upload failed:', error); } finally { setProcessing(false); } }; |
рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЬреЛрдбрд╝рдирд╛
рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЬреЛрдбрд╝рдирд╛ рдкрдардиреАрдпрддрд╛ рдФрд░ рд░рдЦрд░рдЦрд╛рд╡ рдореЗрдВ рд╕рд╣рд╛рдпрдХ рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдВ handleUpload рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдиреЛрдЯреЗрдЯреЗрдб рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
const handleUpload = async (event) => { // рд▓реЛрдбрд░ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕реНрдЯреЗрдЯ рдХреЛ true рд╕реЗрдЯ рдХрд░реЗрдВ setProcessing(true); // рдПрдХ рдирдпрд╛ FormData рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдБ const formData = new FormData(); // рдЪрдпрдирд┐рдд рдкреНрд░рддреНрдпреЗрдХ рдлрд╛рдЗрд▓ рдХреЛ FormData рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ Array.from(event.target.files).forEach(file => { formData.append('photos', file); }); try { // рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП POST рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ const response = await fetchPostFileUploadWithAuth(`/albums/${albumId}/photo-upload`, formData); console.log(response.data); // рд╕рдлрд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓реЙрдЧ рдХрд░реЗрдВ // рд╕рдлрд▓ рдЕрдкрд▓реЛрдб рдХреЗ рдмрд╛рдж рдПрд▓рдмрдо рд╢реЛ рдкреЗрдЬ рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдВ navigate(`/albums/show?ID=${albumId}`); } catch (error) { console.error('Upload failed:', error); // рдЕрдкрд▓реЛрдб рдХреЗ рджреМрд░рд╛рди рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХреЛ рд▓реЙрдЧ рдХрд░реЗрдВ } finally { // рд▓реЛрдбрд░ рдЫреБрдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕реНрдЯреЗрдЯ рдХреЛ false рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ setProcessing(false); } }; |
рдЕрдкрд▓реЛрдб рдЗрдВрдЯрд░рдлреЗрд╕ рдПрдХреАрдХреГрдд рдХрд░рдирд╛
рдЕрдкрдиреЗ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдореЗрдВ, processing рд╕реНрдЯреЗрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрдкрд▓реЛрдб рдмрдЯрди рдпрд╛ рд▓реЛрдбрд░ рдХреЛ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рд░реЗрдВрдбрд░ рдХрд░реЗрдВред
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
return ( <div className="upload-container"> <input type="file" multiple onChange={handleUpload} disabled={processing} /> {!processing ? ( <button onClick={handleUpload}>рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ</button> ) : ( <Loader /> )} </div> ); |
рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдХреЛ рдмрдврд╝рд╛рдирд╛
рд╕рд░реНрдХреБрд▓рд░ рдкреНрд░реЛрдЧреНрд░реЗрд╕ рдЗрдВрдбрд┐рдХреЗрдЯрд░реНрд╕ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдирд╛
рд╣рдо рдЕрдкрд▓реЛрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдПрдХ рд╕рд░реНрдХреБрд▓рд░ рдкреНрд░реЛрдЧреНрд░реЗрд╕ рдмрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Loader рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рд▓реЛрдбрд░ рдХрдВрдкреЛрдиреЗрдВрдЯ рдмрдирд╛рдирд╛
1 2 3 4 5 6 7 8 9 10 11 12 |
// src/components/Loader.js import React from 'react'; import CircularProgress from '@material-ui/core/CircularProgress'; const Loader = () => ( <div className="loader"> <CircularProgress /> <p>рдЕрдкрд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ...</p> </div> ); export default Loader; |
рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЗрдЯ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛
рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рджреЗрдЦрд╛ рдЧрдпрд╛, processing рд╕реНрдЯреЗрдЯ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд▓реЛрдбрд░ рджрд┐рдЦрд╛рдирд╛ рд╣реИ рдпрд╛ рдЕрдкрд▓реЛрдб рдмрдЯрдиред рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрд▓реЛрдб рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИ, processing рдХреЛ true рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд▓реЛрдбрд░ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрддрд╛ рд╣реИред
рдЕрдкрд▓реЛрдб рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛
рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдЕрдкрд▓реЛрдб рдлреАрдЪрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:
- рдЕрдкрд▓реЛрдб рдкреЗрдЬ рдкрд░ рдЬрд╛рдПрдБ: рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдПрд▓рдмрдо рдЕрдкрд▓реЛрдб рдкреЗрдЬ рддрдХ рдкрд╣реБрдВрдЪреЗрдВред
- рдлреЛрдЯреЛ рдЪреБрдиреЗрдВ: рдбреНрд░реИрдЧ-рдПрдВрдб-рдбреНрд░реЙрдк рдЗрдВрдЯрд░рдлреЗрд╕ рдпрд╛ рдлрд╛рдЗрд▓ рд╕реЗрд▓реЗрдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлреЛрдЯреЛ рдЪреБрдиреЗрдВред
- рдЕрдкрд▓реЛрдб рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ: "рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред
- рд▓реЛрдбрд░ рдХреЛ рджреЗрдЦреЗрдВ: рдЕрдкрд▓реЛрдб рдХреЗ рджреМрд░рд╛рди рд╕рд░реНрдХреБрд▓рд░ рдкреНрд░реЛрдЧреНрд░реЗрд╕ рдЗрдВрдбрд┐рдХреЗрдЯрд░ рдХреЗ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВред
- рд░реЗрдбрд╛рдпрд░реЗрдХреНрд╢рди рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ: рд╕рдлрд▓ рдЕрдкрд▓реЛрдб рдХреЗ рдмрд╛рдж, рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдПрд▓рдмрдо рд╢реЛ рдкреЗрдЬ рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИред
- рдмреИрдХрдПрдВрдб рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ: рдмреИрдХрдПрдВрдб рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреБрдХреНрдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреА рдЬрд╛ рд░рд╣реА рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реЛрд▓ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВред
рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдирд╛
рдпрджрд┐ рдХреЛрдИ рдЕрдкрд▓реЛрдб рдЕрд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рддреНрд░реБрдЯрд┐ рдХреЛ рд╕рд╣рдЬрддрд╛ рд╕реЗ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рд╕рдВрднрд╡рддрдГ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдХреЗред
1 2 3 4 |
} catch (error) { console.error('Upload failed:', error); alert('рдЖрдкрдХреЗ рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдЖрдИред рдХреГрдкрдпрд╛ рдкреБрдирдГ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред'); } |
рдирд┐рд╖реНрдХрд░реНрд╖
React рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рджреЛрдиреЛрдВ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред рдЕрдкрд▓реЛрдб рдХреЗ рджреМрд░рд╛рди рджреГрд╢реНрдп рдкреНрд░рддрд┐рдкреБрд╖реНрдЯрд┐ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реВрдЪрд┐рдд рд░рд╣рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЙрдЪреНрдЪ рд╕рдВрддреБрд╖реНрдЯрд┐ рдФрд░ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ рдиреЗ рдЖрдкрдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрдЕрдк рдХрд░рдиреЗ, рдЕрдкрд▓реЛрдб рдлреАрдЪрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ, рд╕рд░реНрдХреБрд▓рд░ рдкреНрд░реЛрдЧреНрд░реЗрд╕ рдЗрдВрдбрд┐рдХреЗрдЯрд░ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ, рдФрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдордЬрдмреВрддреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реЗ рдЬрд╛рдпрд╛ред
рдореБрдЦреНрдп рд╕реАрдЦ
- рдЧрддрд┐рд╢реАрд▓ рд╣реИрдВрдбрд▓рд┐рдВрдЧ: URL рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдирд┐рдХрд╛рд▓рдирд╛ рд▓рдЪреАрд▓реА рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлреАрдбрдмреИрдХ: рд▓реЛрдбрд░реНрд╕ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рддрд┐рдкреБрд╖реНрдЯрд┐ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИред
- рдХреЛрдб рд╕рдВрдЧрдарди: рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдХрд░рдирд╛ рд╕реНрдХреЗрд▓реЗрдмрд┐рд▓рд┐рдЯреА рдФрд░ рд░рдЦрд░рдЦрд╛рд╡ рдореЗрдВ рд╕рд╣рд╛рдпрдХ рд╣реЛрддрд╛ рд╣реИред
- рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ: рд╡реНрдпрд╛рдкрдХ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред
SEO рдХреАрд╡рд░реНрдб
React рдлреЛрдЯреЛ рдЕрдкрд▓реЛрдб, рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди, рд╕рд░реНрдХреБрд▓рд░ рдкреНрд░реЛрдЧреНрд░реЗрд╕ рдмрд╛рд░, React рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓, React рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдмрдврд╝рд╛рдирд╛, React рдЕрдкрд▓реЛрдб рдХрдВрдкреЛрдиреЗрдВрдЯ, React рдореЗрдВ рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рд╕рдВрднрд╛рд▓рдирд╛, React useState рд╣реБрдХ, React useNavigate, axios рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб React
рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрд╕рд╛рдзрди
- React рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг
- React Router рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг
- Axios рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг
- Material-UI рд╕рд░реНрдХреБрд▓рд░ рдкреНрд░реЛрдЧреНрд░реЗрд╕
рдиреЛрдЯ: рдпрд╣ рд▓реЗрдЦ AI рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред