π’ ΠΠ°ΡΠΊΠ°ΡΠ½ΡΠ΅ ΡΠΊΡΠ°Π½Ρ: ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π² React
ΠΠ°ΡΠΊΠ°ΡΠ½ΡΠ΅ ΡΠΊΡΠ°Π½Ρ - ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡΠ°ΠΌΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ UX-ΠΏΠ°ΡΡΠ΅ΡΠ½ΠΎΠ². ΠΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΈΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ React Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ React Loading Skeleton.
ΠΡΠΎΡΠ΅ΡΡΠΈΠΎΠ½Π°Π»Ρ Π² ΠΎΠ±Π»Π°ΡΡΠΈ UI/UX ΡΡΠ²Π΅ΡΠΆΠ΄Π°ΡΡ, ΡΡΠΎ Π²Π°ΠΆΠ½ΠΎ ΡΠΎΡ ΡΠ°Π½ΡΡΡ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ ΠΎΠΆΠΈΠ΄Π°ΡΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ.
Π’ΡΠ°Π΄ΠΈΡΠΈΠΎΠ½Π½ΠΎ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π² Π²Π΅Π±Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ ΡΠΏΠΈΠ½Π½Π΅ΡΡ ΠΈ Π»ΠΎΠ°Π΄Π΅ΡΡ. ΠΡΠΎ Ρ ΠΎΡΠΎΡΠΈΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, Π²Π΅Π΄Ρ Π°Π½ΠΈΠΌΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΠΈΠΊΠΎΠ½ΠΊΠ° ΡΠ΅ΡΠΊΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ: ΠΏΡΠΎ Π²Π°Ρ Π½Π΅ Π·Π°Π±ΡΠ»ΠΈ, ΠΏΡΠΎΡΠ΅ΡΡ ΠΈΠ΄Π΅Ρ. ΠΠ΄Π½Π°ΠΊΠΎ Π² ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡΡ ΠΎΠ½ ΡΠΆΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ°ΡΠ΅Π». Π§Π΅Π»ΠΎΠ²Π΅ΠΊ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ, Π½ΠΎ ΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° Π΄Π²ΠΈΠΆΡΡΠΈΠ΅ΡΡ ΡΠΎΡΠΊΠΈ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΠΊΡΡΠ½ΠΎ. ΠΠ°ΠΆΠ΄ΡΠΉ ΠΎΠ±ΠΎΡΠΎΡ ΡΠΏΠΈΠ½Π½Π΅ΡΠ° Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠ°Π·Π΄ΡΠ°ΠΆΠ΅Π½ΠΈΡ.
ΠΠ° ΡΠΌΠ΅Π½Ρ Π»ΠΎΠ°Π΄Π΅ΡΠ°ΠΌ ΠΏΡΠΈΡΠ»ΠΈ "ΠΊΠ°ΡΠΊΠ°ΡΠ½ΡΠ΅" ΡΠΊΡΠ°Π½Ρ (skeleton screens), ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΏΡΠΎΡΡΠΎ "ΡΡΠ½ΡΡ Π²ΡΠ΅ΠΌΡ", Π½ΠΎ ΠΈ Π»ΡΡΡΠ΅ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°ΡΡ ΠΏΡΠΎΠ³ΡΠ΅ΡΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ, ΡΠΌΠ΅Π½ΡΡΠ°Ρ Π½Π΅Π³Π°ΡΠΈΠ²Π½ΡΠ΅ ΠΎΡΡΡΠ΅Π½ΠΈΡ ΡΠ·Π΅ΡΠ° (loading-time frustration). ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ»Π»ΡΠ·ΠΈΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΊΠΎΠ½ΡΠ΅Π½Ρ Π²ΠΎΡ-Π²ΠΎΡ ΠΏΠΎΡΠ²ΠΈΡΡΡ.
Π‘Π΅Π³ΠΎΠ΄Π½Ρ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡΡΡ, ΠΊΠ°ΠΊ ΠΈΡ Π΄Π΅Π»Π°ΡΡ Π² React-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡ .
ΠΠ»ΠΎΠ±Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ³ΡΡΠΆΠ΅Π½ΠΈΡ Π² ΠΎΡΠ½ΠΎΠ²Ρ CSS, JS ΠΈΠ»ΠΈ React Π½Π΅ Π±ΡΠ΄Π΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΌΠ΅Π»ΠΎ ΡΠΈΡΠ°ΡΡ Π΄Π°Π»ΡΡΠ΅, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΠ΅ΡΡ ΡΠΊΡΠΏΠ΅ΡΡΠΎΠΌ Π² ΡΡΠΈΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΡ .
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΊΠ°ΡΠΊΠ°ΡΠ½ΡΠ΅ ΡΠΊΡΠ°Π½Ρ?
ΠΠ°ΡΠΊΠ°ΡΠ½ΡΠΉ, ΠΈΠ»ΠΈ ΡΠΊΠ΅Π»Π΅ΡΠ½ΡΠΉ, ΡΠΊΡΠ°Π½ β ΡΠ°Π·Π½ΠΎΠ²ΠΈΠ΄Π½ΠΎΡΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°. Π’Π°ΠΊΠΎΠΉ UI ΠΏΠΎΠ²ΡΠΎΡΡΠ΅Ρ "Π½Π°ΡΡΠΎΡΡΡΡ" ΡΠ°Π·ΠΌΠ΅ΡΠΊΡ ΡΡΡΠ°Π½ΠΈΡΡ, Π½ΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ½ΡΡ Π΅Π΄ΠΈΠ½ΠΈΡ β ΡΠ΅ΠΊΡΡΠ°, ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠ°ΡΡΠΎΡΠ΅ΠΊ, Π±Π»ΠΎΠΊΠΎΠ² β ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ "Π·Π°Π³Π»ΡΡΠΊΠΈ", ΡΡ ΠΎΠΆΠΈΠ΅ Ρ Π½ΠΈΠΌΠΈ ΠΏΠΎ ΡΠΎΡΠΌΠ΅ (ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ΅ΡΡΠ΅ Π»ΠΈΠ½ΠΈΠΈ ΠΈ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΡ Π³ΡΡΠΏΠΏΡ). ΠΠΎΠ³Π΄Π° ΠΊΠΎΠ½ΡΠ΅Π½Ρ Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ ΡΠ²ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ Π² ΠΌΠ°ΠΊΠ΅ΡΠ΅, Π·Π°Π³Π»ΡΡΠΊΠΈ ΠΈΡΡΠ΅Π·Π°ΡΡ. ΠΡΠΎΡ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π½Π΅ ΡΠ°ΠΊΠΈΠΌ ΡΠ΅Π·ΠΊΠΈΠΌ, ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈΡΡΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΠ΅ΠΉ ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ ΡΠ΅ΠΊΡΡΠΎΠΌ.
ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΡΡΠΎ Π·Π°Π½ΡΡΡΠΉ ΠΏΠ»Π΅ΠΉΡΡ ΠΎΠ»Π΄Π΅ΡΠ°ΠΌΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΡΠ΅Π°Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ "ΡΠΊΠ΅Π»Π΅Ρ" ΡΡΡΠ°Π½ΠΈΡΡ.
Π’Π°ΠΊ ΠΊΠ°ΠΊ ΡΠΊΠ΅Π»Π΅ΡΠ½ΡΠΉ UI Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ Π½Π°ΡΡΠΎΡΡΠΈΠΉ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²ΠΈΠ΄ΠΈΡ ΡΡΡΡΠΊΡΡΡΡ ΡΡΡΠ°Π½ΠΈΡΡ Π΄Π°ΠΆΠ΅ Π±Π΅Π· ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°, ΠΈ Ρ Π½Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π²ΠΏΠ΅ΡΠ°ΡΠ»Π΅Π½ΠΈΠ΅, Π±ΡΠ΄ΡΠΎ Π·Π°Π³ΡΡΠ·ΠΊΠ° ΠΈΠ΄Π΅Ρ Π±ΡΡΡΡΠ΅Π΅ β ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΡΡΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΡΠ°ΠΏ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠΆΠ΅ ΠΏΡΠΎΡΠ΅Π».
ΠΠ°ΡΠΊΠ°ΡΠ½ΡΠ΅ ΡΠΊΡΠ°Π½Ρ ΠΎΡΠ»ΠΈΡΠ½ΠΎ ΡΠΎΡΠ΅ΡΠ°ΡΡΡΡ Ρ ΡΠ΅Ρ Π½ΠΈΠΊΠΎΠΉ Π»Π΅Π½ΠΈΠ²ΠΎΠΉ Π·Π°Π³ΡΡΠ·ΠΊΠΈ: ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎΠ΅ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π±ΠΎΠ»Π΅Π΅ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ, ΠΊΠΎΠ³Π΄Π° ΡΠΆΠ΅ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ ΠΈΡ .
ΠΡΡΠ³ΠΈΠ΅ Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΠ΅Ρ Π½ΠΈΠΊΠΈ:
- ΠΏΡΠΈΠ·ΡΠ°ΡΠ½ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ (ghost elements),
- Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΠΈ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° (content placeholders),
- Π·Π°Π³ΡΡΠ·ΡΠΈΠΊΠΈ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° (content loaders).
ΠΡΠΈΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠΌ ΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΠ°ΠΉΡΡ, Π² ΡΠΎΠΌ ΡΠΈΡΠ»Π΅ ΠΏΠΎΡΡΠ°Π»Ρ ΠΊΡΡΠΏΠ½ΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ: Blockchain.com, YouTube, Facebook, Medium.
Π’ΠΈΠΏΡ ΠΊΠ°ΡΠΊΠ°ΡΠ½ΡΡ ΡΠΊΡΠ°Π½ΠΎΠ²
ΠΠ°ΡΠΊΠ°ΡΠ½ΡΠ΅ ΡΠΊΡΠ°Π½Ρ Π±ΡΠ²Π°ΡΡ ΡΠ°Π·Π½ΡΠΌΠΈ. Π‘Π°ΠΌΡΠ΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠ΅ β ΡΡΠΎ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ ΠΈ Π³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ (ΡΠ²Π΅ΡΠ½ΡΠ΅) Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΠΈ.
Π’Π΅ΠΊΡΡΠΎΠ²ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΡ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ Π½Π΅ Π½ΡΠΆΠ½ΠΎ Π·Π½Π°ΡΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ ΡΠ΅Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°, ΡΡΠΎΠ±Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π΅Π³ΠΎ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»Π΅ΠΌ.
ΠΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΊΠ°ΡΠΊΠ°ΡΡ ΡΠ»ΠΎΠΆΠ½Π΅Π΅ β ΠΎΠ½ΠΈ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΠΌΠ΅ΡΠ°ΡΡ, ΠΈ Π²ΡΡΡΠ΅ΡΠ°ΡΡΡΡ ΡΠ΅ΠΆΠ΅.
ΠΠΎΡΠΎΠ²ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ
ΠΠ»Ρ Π±ΡΡΡΡΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° ΠΊΠ°ΡΠΊΠ°ΡΠ½ΡΡ ΡΠΊΡΠ°Π½ΠΎΠ² Π² Π²Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π³ΠΎΡΠΎΠ²ΡΠΌΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡΠΌΠΈ. ΠΠ»Ρ React ΠΎΠ½ΠΈ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΠΎΠΆΠ΅ Π΅ΡΡΡ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΏΠ°ΡΠΎΡΠΊΡ Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°.
React Placeholder
Π Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ: buildo/react-placeholder
ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΠΏΠ°ΠΊΠ΅ΡΠ°:
npm install --save react-placeholder
ΠΠΎΡΡΠΎΠΈΠ½ΡΡΠ²Π°
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠ»ΡΡΠΈΡΡΡΡΠ°Ρ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ (ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΡΡΠ΅ΠΊΡ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ Π½Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°Ρ
-ΠΏΠ»Π΅ΠΉΡΡ
ΠΎΠ»Π΄Π΅ΡΠ°Ρ
).
- API Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ².
ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ
- ΠΠ°ΡΠΊΠ°ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΠΏΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΡΡΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΡΠΈΠ»Π΅ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΡΡΠ΅Π±ΠΎΠ²Π°ΡΡΡΡ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΡΠΊΠ°ΡΠ°.
- ΠΡΠΈΠ²Π°Ρ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΅ΡΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠ»ΡΡΠ°Π΅Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ.
ΠΡΠΈΠΌΠ΅Ρ
ΠΡΠΈΠΌΠ΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΠ΅Π»Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ react-placeholder:
import { TextBlock, RectShape } from 'react-placeholder/lib/placeholders'; import ReactPlaceholder from 'react-placeholder'; const GhostPlaceholder = () => ( <div className='my-placeholder'> <RectShape color='gray' style={{width: 25, height: 70}} /> <TextBlock rows={6} color='blue'/> </div> ); <ReactPlaceholder ready={ready} customPlaceholder={<GhostPlaceholder />}> <MyComponent /> </ReactPlaceholder>
ΠΠ° ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°ΡΠΊΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΏΠ»Π΅ΠΉΡΡ
ΠΎΠ»Π΄Π΅ΡΠ° ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ReactPlaceholder
. ΠΠ½ ΠΏΡΠΎΡΡΠΎ ΠΎΠ±ΠΎΡΠ°ΡΠΈΠ²Π°Π΅Ρ Π½ΡΠΆΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΡΠ΅Π³. ΠΠΈΠ·ΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΠ±ΡΠ°ΡΡ ΡΠ°ΠΌΠΈ ΠΈΠ· Π΄ΠΎΡΡΡΠΏΠ½ΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈ ΡΠΎΡΠΌ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² Π°ΡΡΠΈΠ±ΡΡ customPlaceholder
.
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ GhostPlaceholder
. ΠΠ½ΡΡΡΠΈ Π½Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ TextBlock
(Π±Π»ΠΎΠΊ ΡΠ΅ΠΊΡΡΠ°) ΠΈ RectShape
(ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ), ΠΈΠΌΠΏΠΎΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΈΠ· react-placeholder/lib/placeholder
.
ΠΡΠ΅ ΠΏΠ»Π΅ΠΉΡΡ ΠΎΠ»Π΄Π΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡΡΠ°ΠΈΠ²Π°ΡΡ ΡΠ΅ΡΠ΅Π· Ρ.Π½. ΠΏΡΠΎΠΏΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π°Π΄Π°ΡΡ ΡΠ²Π΅Ρ ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ (ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΡΠ΄ΠΎΠ² ΡΠ΅ΠΊΡΡΠ°) Π΄Π»Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ°.
Π§ΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΊΠ°ΡΠΊΠ°Ρ, Π° ΠΊΠΎΠ³Π΄Π° ΡΠΆΠ΅ ΠΏΠΎΠ΄ΡΠ΅Ρ
Π°Π» ΠΊΠΎΠ½ΡΠ΅Π½Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π±ΡΠ»Π΅Π²ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ ready
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ReactPlaceholder
.
ΠΠΎΠ»ΡΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π²Ρ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ.
React Loading Skeleton
Π Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ: dvtng/react-loading-skeleton
ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΠΏΠ°ΠΊΠ΅ΡΠ°:
npm install --save react-loading-skeleton
ΠΠΎΡΡΠΎΠΈΠ½ΡΡΠ²Π°
- ΠΡΠ½ΠΎΠ²Π°Π½ Π½Π° API, Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΠΊΠ°ΡΡΠΎΠΌΠΈΠ·ΠΈΡΡΠ΅ΠΌΡΠΉ ΡΠ΅ΡΠ΅Π· ΠΏΡΠΎΠΏΡΡ.
- ΠΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠΊΠ΅Π»Π΅ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΡΠ°ΠΊ ΠΈ ΠΏΡΡΠΌΠΎ Π²Π½ΡΡΡΠΈ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°.
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ΅ΠΌΡ ΠΈ ΠΏΡΠ»ΡΡΠΈΡΡΡΡΡΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ.
ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ
- ΠΡΠ»ΠΈΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ ΠΏΡΠΎΡΡΡΡ ΠΏΠ»Π΅ΠΉΡΡ ΠΎΠ»Π΄Π΅ΡΠΎΠ², Π½ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΊΠ°ΡΠΊΠ°ΡΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΡΡΡΠ΄Π½Π΅Π½Π°.
- ΠΠ°Π»ΠΈΡΠΈΠ΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΊΠ΅Π»Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΡΡΡΠ΄Π½ΠΈΡΡ Π΅Π³ΠΎ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½Π°.
ΠΡΠΈΠΌΠ΅Ρ
ΠΡΠΈΠΌΠ΅Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΠ΅Π»Π΅ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ react-loading-skeleton:
import Skeleton, { SkeletonTheme } from "react-loading-skeleton"; const SkeletonComponent = () => ( <SkeletonTheme color="#202020" highlightColor="#444"> <section> <Skeleton height={50} width={50} /> </section> </SkeletonTheme> );
ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Skeleton
ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ΅ΠΌΡ SkeletonTheme
ΠΈΠ· ΠΌΠΎΠ΄ΡΠ»Ρ.
Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ SkeletonComponent
. SkeletonTheme
ΡΠ»ΡΠΆΠΈΡ ΠΎΠ±Π΅ΡΡΠΊΠΎΠΉ Π΄Π»Ρ Π²ΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΠΏΡΠΎΠΏΡΠ°Ρ
ΡΠ²Π΅ΡΠ° (color
, highlightColor
), ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΠΎΡΠΎΡΠΌΠ»Π΅Π½ΠΈΠΈ ΠΏΠ»Π΅ΠΉΡΡ
ΠΎΠ»Π΄Π΅ΡΠΎΠ² ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΡΡΠ΅ΠΊΡΠΎΠ². ΠΠ½ΡΡΡΠΈ Π½Π΅Π³ΠΎ ΡΠ°ΡΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Skeleton
, ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΡ Π·Π°Π΄Π°Π΅ΠΌ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΎΠΏΡΠΎΠ² width
ΠΈ height
.
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠΎΡ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅: ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π΅ΠΌ Ρ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠΊΠ΅Π»Π΅ΡΠ½ΡΠΉ ΡΠΊΡΠ°Π½ YouTube.
ΠΠ°ΡΠΊΠ°ΡΠ½ΡΠ΅ ΡΠΊΡΠ°Π½Ρ Π² ΡΡΠΈΠ»Π΅ YouTube
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° React
Π‘Π°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΈ Π½Π°ΡΡΡΠΎΠΈΡΡ React Π² Π½ΠΎΠ²ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ β ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΈΠ»ΠΈΡΡ Create React App. ΠΡΠΈ ΡΡΠΎΠΌ Π²Π°ΠΌ ΠΏΠΎΡΡΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π΄Π΅Π»Π°ΡΡ β ΡΠΎΠ»ΡΠΊΠΎ Π½Π°Π±ΡΠ°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅. Π‘Π½Π°ΡΠ°Π»Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΠΌΠΎΠ΄ΡΠ»Ρ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΠΎ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΡΠΎΠ³ΠΎ Π΅ΡΠ΅ Π½Π΅ ΡΠ΄Π΅Π»Π°Π»ΠΈ:
npm install -g create-react-app
ΠΠ°ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ skeleton-screens
:
npx create-react-app skeleton-screens
ΠΠΎΠ³Π΄Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π²Π΅ΡΡΠΈΡΡΡ, ΠΏΠ΅ΡΠ΅ΠΉΠ΄ΠΈΡΠ΅ Π² ΠΏΠ°ΠΏΠΊΡ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ:
cd skeleton-screens yarn start
ΠΡ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ ΠΏΡΠΈΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΊΡΠ°Π½ React:
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°
ΠΠΌΠ΅ΡΡΠΎ ΡΠ΅Π°Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ Ρ YouTube ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Π΅Π½Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ², ΡΡΠΎΠ±Ρ Π½Π΅ ΡΡΠ»ΠΎΠΆΠ½ΡΡΡ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ.
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ» data.js
Π² ΠΏΠ°ΠΏΠΊΠ΅ src
ΠΈ ΡΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΡΡΠ΄Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄:
const dummyData= [ { section: "Recommended", channel: "CNN", items: [ { id: "fDObf2AeAP4", image: "https://img.youtube.com/vi/fDObf2AeAP4/maxresdefault.jpg", title: "75 million Americans ordered to stay home", views: "1.9M views", published: "3 days agos" }, { id: "3AzIgAa0Cm8", image: "https://img.youtube.com/vi/3AzIgAa0Cm8/maxresdefault.jpg", title: "Gupta: The truth about using chloroquine to fight coronavirus pandemic", views: "128K views", published: "4 hours ago" }, { id: "92B37aXykYw", image: "https://img.youtube.com/vi/92B37aXykYw/maxresdefault.jpg", title: "Willie Jones STUNS Simon Cowell In Pitch Perfect Performance of 'Your Man'!", views: "2.47 million views", published: "1 month ago" }, { id: "J6rVaFzOEP8", image: "https://img.youtube.com/vi/J6rVaFzOEP8/maxresdefault.jpg", title: "Guide To Becoming A Self-Taught Software Developer", views: "104K views", published: "17 days ago" }, { id: "Wbk8ZrfU3EM", image: "https://img.youtube.com/vi/Wbk8ZrfU3EM/maxresdefault.jpg", title: "Tom Hanks and Rita Wilson test positive for coronavirus", views: "600k views", published: "1 week ago" }, { id: "ikHpFgKJax8", image: "https://img.youtube.com/vi/ikHpFgKJax8/maxresdefault.jpg", title: "Faces Of Africa- The Jerry Rawlings story", views: "2.3 million views", published: "2014" } ] }, { section: "Breaking News", channel: "CGTN America", items: [ { id: "tRLDPy1A8pI", image: "https://img.youtube.com/vi/tRLDPy1A8pI/maxresdefault.jpg", title: "Is Trump blaming China for COVID-19? You decide.", views: "876k views", published: "9 days ago" }, { id: "2ulH1R9hlG8", image: "https://img.youtube.com/vi/2ulH1R9hlG8/maxresdefault.jpg", title: "Journalist still goes to office during pandemic, see her daily routine", views: "873 views", published: "3 hours ago" }, { id: "\_TkfQ9MaIgU", image: "https://img.youtube.com/vi/_TkfQ9MaIgU/maxresdefault.jpg", title: "How are small businesses going to survive the economic downturn of the COVID-19 era?", views: "283 views", published: "4 day ago" } ] } ]; export default dummyData;
Π ΡΡΠΎΠΌ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½Ρ Π΄Π²Π° Π±Π»ΠΎΠΊΠ° ΡΡΡΠ°Π½ΠΈΡΡ β "Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½Π½ΠΎΠ΅" ΠΈ "ΠΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΡΡΠΈ" β ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΠΈΠ΄Π΅ΠΎ-ΠΏΡΠ΅Π²ΡΡ.
Π’Π΅ΠΏΠ΅ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ Π΄Π»Ρ Π²Π΅ΡΡΡΠΊΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΠ°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°:
Card
β ΠΏΡΠ΅Π²ΡΡ Π²ΠΈΠ΄Π΅ΠΎ. Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΌΠΈΠ½ΠΈΠ°ΡΡΡΡ Π²ΠΈΠ΄Π΅ΠΎ, Π΅Π³ΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΎΡΠΌΠΎΡΡΠΎΠ², Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠ°Π½Π°Π»Π° ΠΈ Π΄Π°ΡΡ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ.CardList
β Π³ΡΡΠΏΠΏΠ° ΠΏΡΠ΅Π²ΡΡ.App
β ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ½ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡdummyData
, ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΠΊΠ°ΡΠΊΠ°ΡΠ½ΡΠΉ ΡΠΊΡΠ°Π½ Π² ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π²ΡΡ ΡΠ΅ΠΊΡΠ½Π΄, ΠΈΠΌΠΈΡΠΈΡΡΡ Π·Π°Π³ΡΡΠ·ΠΊΡ Π΄Π°Π½Π½ΡΡ , Π° Π·Π°ΡΠ΅ΠΌ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡCardList
.
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠ°ΠΏΠΊΡ components
Π²Π½ΡΡΡΠΈ src
β Π² Π½Π΅ΠΉ Π±ΡΠ΄Π΅ΠΌ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡ ΡΠ°ΠΉΠ»Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ².
Card
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ» Card.js
Π² ΠΏΠ°ΠΏΠΊΠ΅ components
:
import React from "react"; const Card = ({ item, channel }) => { return ( <li className="card"> <a href={`https://www.youtube.com/watch?v=${item.id}`} target="\_blank" rel="noopener noreferrer" className="card-link" > <img src={item.image} alt={item.title} className="card-image" /> <img src={item.image} alt={item.title} className="channel-image" /> <h4 className="card-title">{item.title}</h4> <p className="card-channel"> <i>{channel}</i> </p> <div className="card-metrics"> {item.views} β’ {item.published} </div> </a> </li> ); }; export default Card;
ΠΡΠΎΡΡΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ React-ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π΄Π°Π½Π½ΡΠ΅ Π² ΡΠ°Π±Π»ΠΎΠ½.
CardList
Π€Π°ΠΉΠ» components/CardList.js
:
import React from "react"; import Card from "./Card"; const CardList = ({ list }) => { return ( <ul className="list"> {list.items.map((item, index) => { return <Card key={index} item={item} channel={list.channel} />; })} </ul> ); }; export default CardList;
ΠΡΠΎΡ ΠΊΠΎΠ΄ Π΅ΡΠ΅ ΠΏΡΠΎΡΠ΅ β ΠΎΠ½ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π½Π° ΡΠΊΡΠ°Π½ ΠΌΠ°ΡΡΠΈΠ² ΠΏΡΠ΅Π²ΡΡΡΠ΅ΠΊ Card
.
App
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΎΡΠΊΡΠΎΠΉΡΠ΅ ΡΠ°ΠΉΠ» App.js
, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΆΠ΅ ΡΠΎΠ·Π΄Π°Π½ ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΠ΅ Π² Π½Π΅ΠΌ ΠΊΠΎΠ΄:
import React, { useState, useEffect } from "react"; import "./App.css"; import dummyData from "./data"; import CardList from "./components/CardList"; const App = () => { const [videos, setVideos] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { setLoading(true); const timer = setTimeout(() => { setVideos(dummyData); setLoading(false); }, 2000); return () => clearTimeout(timer); }, []); return ( <div className="App"> { videos.map((list, index) => { return ( <section key={index}> <h2 className="section-title">{list.section}</h2> <CardList list={list} /> <hr /> </section> ); })} </div> ); }; export default App;
ΠΡΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ»ΠΎΠΆΠ½Π΅Π΅, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅.
ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Ρ
ΡΠΊ useState
, ΡΡΠΎΠ±Ρ Ρ
ΡΠ°Π½ΠΈΡΡ ΡΠΏΠΈΡΠΎΠΊ Π²ΠΈΠ΄Π΅ΠΎ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ.
Π₯ΡΠΊ useEffect
ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΈΠΌΠΈΡΠ°ΡΠΈΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠΈ Π΄Π°Π½Π½ΡΡ
Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° Ρ Π·Π°Π΄Π΅ΡΠΆΠΊΠΎΠΉ: ΡΡΠ°ΡΡΠΉ-Π΄ΠΎΠ±ΡΡΠΉ setTimeout. Π’ΠΎΠ»ΡΠΊΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΡΠ΅Π°Π»ΡΠ½ΡΡ
Π΄Π°Π½Π½ΡΡ
ΠΌΡ ΡΠΎΡ
ΡΠ°Π½ΠΈΠΌ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Π΅Π½Π½ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² ΠΈΠ· ΡΠ°ΠΉΠ»Π° data.js
.
ΠΠΎΡΠ»Π΅ "Π·Π°Π³ΡΡΠ·ΠΊΠΈ" Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π±Π»ΠΎΠΊ Π²ΠΈΠ΄Π΅ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° videos.map
. ΠΠ°ΡΡΠΈΠ² ΠΊΠ°ΡΡΠΎΡΠ΅ΠΊ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΡΡ Π² Π°ΡΡΠΈΠ±ΡΡΠ΅ list
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ CardList
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° Π΅Π³ΠΎ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ.
ΠΠΎΠΊΠ° Π² ΡΠ°Π±Π»ΠΎΠ½Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ loading,
ΡΠΊΠΎΡΠΎ ΠΌΡ ΠΊ Π½Π΅ΠΉ Π²Π΅ΡΠ½Π΅ΠΌΡΡ.
Π‘ΡΠΈΠ»ΠΈΠ·Π°ΡΠΈΡ
ΠΠΎ ΡΠΈΡ
ΠΏΠΎΡ ΠΌΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΡΡΡΠ°Π²Π»ΡΠ»ΠΈ ΠΊΠ»Π°ΡΡΡ Π² Π²Π΅ΡΡΡΠΊΠ΅, Π½ΠΎ Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠ»ΠΈ ΡΠ΅Π°Π»ΡΠ½ΡΠ΅ ΡΡΠΈΠ»ΠΈ Π΄Π»Ρ Π½ΠΈΡ
. ΠΠΎΡΠ° ΠΎΠ±Π»Π°Π³ΠΎΡΠΎΠ΄ΠΈΡΡ Π²Π½Π΅ΡΠ½ΠΈΠΉ Π²ΠΈΠ΄ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠΊΡΠΎΠΉΡΠ΅ ΡΠ°ΠΉΠ» App.css
Π² ΠΏΠ°ΠΏΠΊΠ΅ src
ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΊΠΎΠ΄ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ:
.App { max-width: 960px; margin: 0 auto; font-size: 16px; } .list { display: flex; justify-content: space-between; flex-wrap: wrap; list-style: none; padding: 0; } .section-title { margin-top: 30px; } .card { width: calc(33% - 10px); margin: 20px 0; } .card-link { color: inherit; text-decoration: none; } .card-image { width: 100%; } .channel-image { border-radius: 100%; padding: 0, 10px, 0, 0; width: 40px; height: 40px; } .card-title { margin-top: 10px; margin-bottom: 0; } .card-channel { margin-top: 5px; margin-bottom: 5px; font-size: 14px; } /* Tablets */ @media (max-width: 1000px) { .App { max-width: 600px; } .card { width: calc(50% - 22px); } } /* Mobiles */ @media (max-width: 640px) { .App { max-width: 100%; padding: 0 15px; } .card { width: 100%; } }
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΊΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΠΏΠΎΠΊΠ° Π±Π΅Π· ΠΊΠ°ΡΠΊΠ°ΡΠ½ΡΡ ΡΠΊΡΠ°Π½ΠΎΠ². ΠΠ°ΡΡ ΡΠ΅ΠΊΡΠ½Π΄, ΠΊΠΎΠ³Π΄Π° ΡΡΡΠ°Π½ΠΈΡΠ° Π·Π°Π³ΡΡΠΆΠ°Π΅ΡΡΡ, ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ Π±Π΅Π»ΡΠΉ ΡΠΊΡΠ°Π½, Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ ΡΡΠ°Π·Ρ.
ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ React Loading Skeleton
Π React Loading Skeleton Π²Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΊΠ΅Π»Π΅ΡΠ½ΡΠΉ ΡΠΊΡΠ°Π½, ΡΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄Π±ΠΈΡΠ°Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΈΠΏΠΎΠ³ΡΠ°ΡΠΈΠΊΠΈ, ΠΎΡΡΡΡΠΏΡ ΠΈ ΠΏΡΠΎΡΠΈΠ΅ ΡΡΠΈΠ»ΠΈ ΠΏΠΎΠ΄ Π²Π°Ρ ΠΊΠΎΠ½ΡΠ΅Π½Ρ. ΠΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ ΠΏΡΡΠΌΠΎ Π²Π½ΡΡΡΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π²ΠΌΠ΅ΡΡΠΎ Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°.
Π£ ΡΡΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π΅ΡΡΡ ΠΏΠ°ΡΠ° ΠΏΠΎΠ»Π΅Π·Π½ΡΡ ΠΏΠ»ΡΡΠ΅ΠΊ: Π»Π΅Π³ΠΊΠ°Ρ ΡΠ΅ΠΌΠΈΠ·Π°ΡΠΈΡ ΠΈ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΠΈΠΊΠ»Π° Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ.
Π’Π΅ΠΌΡ
React Loading Skeleton ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΏΡΠΎΡΡΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΡ ΡΠ΅ΠΌ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡΡ ΡΡΠΈΠ»Ρ ΡΡΠ°Π·Ρ Π²ΡΠ΅Ρ
ΡΠΊΠ΅Π»Π΅ΡΠ½ΡΡ
ΡΠΊΡΠ°Π½ΠΎΠ², Π²Π½Π΅ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅. ΠΠ° ΡΡΠΎ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ SkeletonTheme
.
import Skeleton, { SkeletonTheme } from "react-loading-skeleton"; <SkeletonTheme color="grey" highlightColor="#444"> <p> <Skeleton height={250} width={300} count={1} /> </p> </SkeletonTheme> <SkeletonTheme color="#990" highlightColor="#550"> <p> <Skeleton height={250} width={300} count={1} /> </p> </SkeletonTheme>
ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ
ΠΠΎΠΌΠΈΠΌΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΡ
ΠΏΡΠΎΠΏΡΠΎΠ² height
, width
ΠΈ color
, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ°ΠΊΠΆΠ΅ ΡΠΊΠ°Π·Π°ΡΡ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ duration
.
<Skeleton duration={2} />
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΎΠ½ΠΎ ΡΠ°Π²Π½ΠΎ 1.2
. ΠΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ ΡΠΊΡΠ°Π½Π°.
ΠΠΎΠ»ΡΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΉΡΠΈ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΏΠ°ΠΊΠ΅ΡΠ°
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ react-loading-skeleton
Π² ΠΏΡΠΎΠ΅ΠΊΡ, Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
npm install react-loading-skeleton
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°
Π’Π΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΊΠ°ΡΠΊΠ°ΡΠ½ΡΠ΅ ΡΠΊΡΠ°Π½Ρ Π΄Π»Ρ Π²ΠΈΠ΄Π΅ΠΎ-Π΄Π°Π½Π½ΡΡ
. Π ΠΏΠ°ΠΏΠΊΠ΅ components
ΡΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ SkeletonCard.js
:
import React from "react"; import Skeleton from "react-loading-skeleton"; const SkeletonCard = () => { return ( <section> <h2 className="section-title"> <Skeleton height={30} width={300} /> </h2> <ul className="list"> {Array(9) .fill() .map((item, index) => ( <li className="card" key={index}> <Skeleton height={180} /> <h4 className="card-title"> <Skeleton circle={true} height={50} width={50} /> <Skeleton height={36} width={`80%`} /> </h4> <p className="card-channel"> <Skeleton width={`60%`} /> </p> <div className="card-metrics"> <Skeleton width={`90%`} /> </div> </li> ))} </ul> </section> ); }; export default SkeletonCard;
ΠΠ΄Π΅ΡΡ ΠΌΡ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½Π΅ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΈ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌ Π΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ (li
) Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° Array.fill()
. ΠΡΠ΅Π³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² 9: ΠΏΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Ρ Π²ΠΈΠ΄Π΅ΠΎΡΠΎΠ»ΠΈΠΊΠΎΠ² Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ dummyData
, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ Π²ΡΠ²Π΅Π΄Π΅Π½Ρ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ ΠΏΠΎΡΠ»Π΅ Π·Π°Π³ΡΡΠ·ΠΊΠΈ.
Π§ΡΠΎΠ±Ρ Π²ΡΠΏΠΎΠΌΠ½ΠΈΡΡ, ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΌΠ΅ΡΠΎΠ΄ Array.fill, Π·Π°Π³Π»ΡΠ½ΠΈΡΠ΅ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° MDN. ΠΠ°ΠΌ ΡΠ΅ΠΉΡΠ°Ρ Π²Π°ΠΆΠ½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ, ΡΡΠΎ ΠΎΠ½ ΡΠΎΠ·Π΄Π°Π΅Ρ ΠΌΠ°ΡΡΠΈΠ² Ρ 9 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΎΠΈΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° Array.map
ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ Π² ΠΌΠ°ΡΡΠΈΠ² ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² li
.
ΠΡΠ°ΠΊ, Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ΅ΠΉΠΊΠΎΠ²ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π΅ΠΎ Ρ Π½Π°Ρ ΡΠΆΠ΅ Π΅ΡΡΡ ΠΊΠ°ΡΠΊΠ°Ρ, ΡΠΎΡΡΠΎΡΡΠΈΠΉ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π±Π»ΠΎΠΊΠΎΠ². ΠΡΠΎΠΏΡΡ height
ΠΈ width
ΠΎΡΠ²Π΅ΡΠ°ΡΡ Π·Π° ΡΠ°Π·ΠΌΠ΅ΡΡ Π±Π»ΠΎΠΊΠ°, Π° circle={true}
ΡΠΎΡΠΌΠΈΡΡΠ΅Ρ ΠΊΡΡΠ³Π»ΡΠΉ Π±Π»ΠΎΠΊ.
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° React Loading Skeleton ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½Π° ΡΠΈΠΌΠΏΠ°ΡΠΈΡΠ½Π°Ρ ΠΏΡΠ»ΡΡΠΈΡΡΡΡΠ°Ρ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ. ΠΡΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ²ΠΎΡ Π°Π½ΠΈΠΌΠ°ΡΠΈΡ, ΠΌΡ ΠΆΠ΅ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ Π΄Π΅ΡΠΎΠ»ΡΠ½ΠΎΠΉ.
ΠΡΡΠ°Π»ΠΎΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ΠΊΠ°ΡΠΊΠ°ΡΠ½ΡΠΉ ΡΠΊΡΠ°Π½ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ Π΅Π³ΠΎ, ΠΏΠΎΠΊΠ° ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΏΠΎΠ΄Π³ΡΡΠ·ΠΊΠ° Π΄Π°Π½Π½ΡΡ
. ΠΠ½Π΅ΡΠΈΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΊΠΎΠ΄ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° App
:
import SkeletonCard from './components/SkeletonCard'; const App = () => { // ... return ( <div className="App"> {loading && <SkeletonCard />} {!loading && videos.map((list, index) => { return ( <section key={index}> <h2 className="section-title">{list.section}</h2> <CardList list={list} /> <hr /> </section> ); })} </div> ); };
ΠΠ΅ΡΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΉΡΠΈ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠ°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π³ΠΎΡΠΎΠ²ΠΎ. ΠΡΠΈ ΠΎΡΠΊΡΡΡΠΈΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΠΊΡΠ°ΡΠΈΠ²ΡΠΉ ΠΊΠ°ΡΠΊΠ°ΡΠ½ΡΠΉ ΡΠΊΡΠ°Π½ Ρ ΠΏΡΠ»ΡΡΠΈΡΡΡΡΠ΅ΠΉ Π°Π½ΠΈΠΌΠ°ΡΠΈΠ΅ΠΉ, Π° Π² ΡΡΠΎ Π²ΡΠ΅ΠΌΡ Π·Π° ΠΊΠ°Π΄ΡΠΎΠΌ ΠΏΠΎΠ΄Π³ΡΡΠΆΠ°ΡΡΡΡ Π΄Π°Π½Π½ΡΠ΅. ΠΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΡ ΠΈΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ (Π½Π° Π΄Π΅ΠΌΠΎ-ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΡΡΠΎΠΈΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠ° Π² 5 ΡΠ΅ΠΊΡΠ½Π΄), ΡΠΎ ΡΡΠ°Π·Ρ Π²ΡΠ²Π΅Π΄Π΅ΠΌ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ.
ΠΠΎΡ ΡΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠ°ΡΠΊΠ°ΡΠ½ΡΠ΅ ΠΈΠ»ΠΈ ΡΠΊΠ΅Π»Π΅ΡΠ½ΡΠ΅ ΡΠΊΡΠ°Π½Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠ»ΡΡΡΠ°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΎΠΏΡΡ. ΠΠ½ΠΈ ΠΈΠ·Π±Π°Π²Π»ΡΡΡ ΠΏΠΎΡΠ΅ΡΠΈΡΠ΅Π»Π΅ΠΉ ΡΠ°ΠΉΡΠ° ΠΎΡ ΡΠ°ΡΡΠ΅ΡΡΠ½Π½ΠΎΡΡΠΈ ΠΈ Π½Π΅ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ Π²ΠΏΠ΅ΡΠ°ΡΠ»Π΅Π½ΠΈΠ΅, Π±ΡΠ΄ΡΠΎ ΠΊΠΎΠ½ΡΠ΅Π½Ρ ΡΠΆΠ΅ Π½Π° ΠΏΠΎΠ΄Ρ ΠΎΠ΄Π΅ ΠΈ Π²ΠΎΡ-Π²ΠΎΡ Π΅Π³ΠΎ ΠΏΠΎΠΊΠ°ΠΆΡΡ.
ΠΠ»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π³ΠΎΡΠΎΠ²ΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈΠ»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΡΠ°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΎΡΡΡΡ Π³Π΅ΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΠΈΠ³ΡΡ ΠΈ ΠΊΠ°ΠΏΠ»ΠΈ Π°Π½ΠΈΠΌΠ°ΡΠΈΠΈ.