Ma'lumotlarni yuklash uchun React Suspense'ni o'zlashtiring. Yuklanish holatlarini deklarativ boshqarishni, o'tishlar bilan UX'ni yaxshilashni va Xatolik Chegaralari bilan xatolarni bartaraf etishni o'rganing.
React Suspense Chegaralari: Deklarativ Yuklanish Holatini Boshqarishga Chuqur Kirish
Zamonaviy veb-ishlab chiqish dunyosida uzluksiz va sezgir foydalanuvchi tajribasini yaratish juda muhimdir. Dasturchilar duch keladigan eng doimiy muammolardan biri bu yuklanish holatlarini boshqarishdir. Foydalanuvchi profil ma'lumotlarini olishdan tortib, ilovaning yangi bo'limini yuklashgacha, kutish lahzalari hal qiluvchi ahamiyatga ega. Tarixiy jihatdan, bu bizning komponentlarimiz bo'ylab tarqalgan isLoading
, isFetching
va hasError
kabi mantiqiy bayroqlarning chigal to'rini o'z ichiga olgan. Bu imperativ yondashuv kodimizni chalkashtiradi, mantiqni murakkablashtiradi va пойга шароитлари (race conditions) kabi xatolarning tez-tez manbai bo'ladi.
React Suspense bilan tanishing. Dastlab React.lazy()
bilan kodni bo'lish uchun joriy qilingan bo'lsa-da, uning imkoniyatlari React 18 bilan sezilarli darajada kengayib, asinxron operatsiyalarni, ayniqsa ma'lumotlarni yuklashni boshqarish uchun kuchli, birinchi darajali mexanizmga aylandi. Suspense bizga yuklanish holatlarini deklarativ usulda boshqarish imkonini beradi, bu esa komponentlarimizni yozish va ular haqida fikr yuritishimizni tubdan o'zgartiradi. "Men yuklanyapmanmi?" deb so'rash o'rniga, bizning komponentlarimiz shunchaki "Render qilish uchun menga bu ma'lumotlar kerak. Kutayotganimda, iltimos, mana bu zaxira UI'ni ko'rsat" deyishi mumkin.
Ushbu keng qamrovli qo'llanma sizni holatni boshqarishning an'anaviy usullaridan React Suspense'ning deklarativ paradigmasiga olib boradi. Biz Suspense chegaralari nima ekanligini, ular kodni bo'lish va ma'lumotlarni yuklash uchun qanday ishlashini hamda foydalanuvchilarni hafsalasini pir qilish o'rniga ularni xursand qiladigan murakkab yuklanish UI'larini qanday tashkil qilishni o'rganamiz.
Eski Usul: Yuklanish Holatlarini Qo'lda Boshqarish Mashaqqati
Suspense'ning nafisligini to'liq qadrlashdan oldin, u hal qiladigan muammoni tushunish muhimdir. Keling, useEffect
va useState
hook'laridan foydalanib ma'lumotlarni yuklaydigan odatiy komponentni ko'rib chiqaylik.
Foydalanuvchi ma'lumotlarini yuklashi va ko'rsatishi kerak bo'lgan komponentni tasavvur qiling:
import React, { useState, useEffect } from 'react';
function UserProfile({ userId }) {
const [user, setUser] = useState(null);
const [isLoading, setIsLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
// Yangi userId uchun holatni qayta o'rnatish
setIsLoading(true);
setUser(null);
setError(null);
const fetchUser = async () => {
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
if (!response.ok) {
throw new Error('Tarmoq javobi yaroqli emas edi');
}
const data = await response.json();
setUser(data);
} catch (err) {
setError(err);
} finally {
setIsLoading(false);
}
};
fetchUser();
}, [userId]); // userId o'zgarganda qayta yuklash
if (isLoading) {
return <p>Profil yuklanmoqda...</p>;
}
if (error) {
return <p>Xatolik: {error.message}</p>;
}
return (
<div>
<h1>{user.name}</h1>
<p>Email: {user.email}</p>
</div>
);
}
Bu yondashuv ishlaydi, lekin uning bir nechta kamchiliklari bor:
- Ortiqcha kod (Boilerplate): Har bir asinxron operatsiya uchun bizga kamida uchta holat o'zgaruvchisi (
data
,isLoading
,error
) kerak bo'ladi. Bu murakkab ilovada yomon miqyoslanadi. - Tarqoq Mantiq: Render qilish mantiqi shartli tekshiruvlar (
if (isLoading)
,if (error)
) bilan bo'laklarga bo'lingan. Asosiy "muvaffaqiyatli yo'l" render mantiqi eng pastga surilib, komponentni o'qishni qiyinlashtiradi. - Poyga Sharoitlari (Race Conditions):
useEffect
hook'i ehtiyotkorlik bilan bog'liqliklarni boshqarishni talab qiladi. To'g'ri tozalashsiz, agaruserId
prop'i tez o'zgarsa, sekin javob tez javobni bekor qilishi mumkin. Bizning misolimiz oddiy bo'lsa-da, murakkab stsenariylar osongina nozik xatoliklarni keltirib chiqarishi mumkin. - Sharshara Yuklanishlari (Waterfall Fetches): Agar ichki komponent ham ma'lumotlarni yuklashi kerak bo'lsa, u ota komponent yuklanishni tugatmaguncha render qilishni (va shuning uchun yuklashni) boshlay olmaydi. Bu ma'lumotlarni samarasiz yuklash sharsharalariga olib keladi.
React Suspense sahnada: Paradigma O'zgarishi
Suspense bu modelni butunlay o'zgartiradi. Komponent yuklanish holatini ichkarida boshqarish o'rniga, u asinxron operatsiyaga bog'liqligini to'g'ridan-to'g'ri React'ga bildiradi. Agar unga kerakli ma'lumotlar hali mavjud bo'lmasa, komponent render qilishni "to'xtatib turadi".
Komponent to'xtatib turilganda, React komponentlar daraxti bo'ylab eng yaqin Suspense Chegarasini topish uchun yuqoriga ko'tariladi. Suspense Chegarasi bu siz daraxtingizda <Suspense>
yordamida belgilaydigan komponentdir. Bu chegara keyin uning ichidagi barcha komponentlar o'z ma'lumotlariga bog'liqliklarini hal qilmaguncha zaxira UI'ni (masalan, spinner yoki skelet yuklovchi) render qiladi.
Asosiy g'oya ma'lumotlarga bog'liqlikni unga muhtoj bo'lgan komponent bilan bir joyda saqlash, shu bilan birga yuklanish UI'sini komponentlar daraxtining yuqori darajasida markazlashtirishdir. Bu komponent mantig'ini tozalaydi va sizga foydalanuvchining yuklanish tajribasi ustidan kuchli nazoratni beradi.
Komponent Qanday Qilib "To'xtatib Turadi"?
Suspense ortidagi sehr bir qarashda g'alati tuyulishi mumkin bo'lgan usulda yotadi: Promise'ni tashlash (throwing a Promise). Suspense'ga moslashtirilgan ma'lumotlar manbai shunday ishlaydi:
- Komponent ma'lumot so'raganda, ma'lumotlar manbai ma'lumotlarning keshda bor-yo'qligini tekshiradi.
- Agar ma'lumot mavjud bo'lsa, uni sinxron ravishda qaytaradi.
- Agar ma'lumot mavjud bo'lmasa (ya'ni, hozirda yuklanayotgan bo'lsa), ma'lumotlar manbai davom etayotgan yuklash so'rovini ifodalovchi Promise'ni tashlaydi.
React bu tashlangan Promise'ni ushlaydi. U ilovangizni ishdan chiqarmaydi. Buning o'rniga, u buni signal sifatida talqin qiladi: "Bu komponent hali render qilishga tayyor emas. Uni to'xtatib turing va zaxira UI'ni ko'rsatish uchun uning ustidagi Suspense chegarasini qidiring." Promise hal bo'lgandan so'ng, React komponentni qayta render qilishga harakat qiladi, endi u o'z ma'lumotlarini oladi va muvaffaqiyatli render qiladi.
<Suspense>
Chegarasi: Sizning Yuklanish UI Deklaratoringiz
<Suspense>
komponenti bu yondashuvning yuragi hisoblanadi. Uni ishlatish juda oddiy, u bitta, majburiy prop'ni oladi: fallback
.
import { Suspense } from 'react';
function App() {
return (
<div>
<h1>Mening Ilovam</h1>
<Suspense fallback={<p>Kontent yuklanmoqda...</p>}>
<SomeComponentThatFetchesData />
</Suspense>
</div>
);
}
Ushbu misolda, agar SomeComponentThatFetchesData
to'xtatib turilsa, foydalanuvchi ma'lumotlar tayyor bo'lguncha "Kontent yuklanmoqda..." xabarini ko'radi. Zaxira UI har qanday yaroqli React tugun bo'lishi mumkin, oddiy satrdan murakkab skelet komponentigacha.
Klassik Foydalanish Holati: React.lazy()
bilan Kodni Bo'lish
Suspense'ning eng keng tarqalgan qo'llanilishi bu kodni bo'lishdir. Bu sizga komponent uchun JavaScript'ni faqat u haqiqatda kerak bo'lganda yuklashni kechiktirish imkonini beradi.
import React, { Suspense, lazy } from 'react';
// Bu komponentning kodi dastlabki to'plamda bo'lmaydi.
const HeavyComponent = lazy(() => import('./HeavyComponent'));
function App() {
return (
<div>
<h2>Darhol yuklanadigan ba'zi kontent</h2>
<Suspense fallback={<div>Komponent yuklanmoqda...</div>}>
<HeavyComponent />
</Suspense>
</div>
);
}
Bu yerda, React HeavyComponent
uchun JavaScript'ni faqat uni birinchi marta render qilishga harakat qilganda yuklaydi. U yuklanayotganda va tahlil qilinayotganda, Suspense zaxirasi ko'rsatiladi. Bu sahifaning dastlabki yuklanish vaqtini yaxshilash uchun kuchli usuldir.
Zamonaviy Chegara: Suspense bilan Ma'lumotlarni Yuklash
React Suspense mexanizmini taqdim etsa-da, u ma'lumotlarni yuklash uchun maxsus klientni taqdim etmaydi. Ma'lumotlarni yuklash uchun Suspense'dan foydalanish uchun sizga u bilan integratsiya qilingan ma'lumotlar manbai kerak (ya'ni, ma'lumotlar kutilayotganda Promise tashlaydigan manba).
Relay va Next.js kabi freymvorklar Suspense uchun o'rnatilgan, birinchi darajali qo'llab-quvvatlashga ega. TanStack Query (ilgari React Query) va SWR kabi mashhur ma'lumotlarni yuklash kutubxonalari ham eksperimental yoki to'liq qo'llab-quvvatlashni taklif qiladi.
Konsepsiyani tushunish uchun, keling, fetch
API atrofida uni Suspense'ga mos keladigan qilish uchun juda oddiy, konseptual o'ram yarataylik. Eslatma: Bu o'quv maqsadlari uchun soddalashtirilgan misol bo'lib, ishlab chiqarishga tayyor emas. Unda to'g'ri keshlash va xatoliklarni qayta ishlashning nozik jihatlari yetishmaydi.
// data-fetcher.js
// Natijalarni saqlash uchun oddiy kesh
const cache = new Map();
export function fetchData(url) {
if (!cache.has(url)) {
cache.set(url, { status: 'pending', promise: fetchAndCache(url) });
}
const record = cache.get(url);
if (record.status === 'pending') {
throw record.promise; // Sehr shu yerda!
}
if (record.status === 'error') {
throw record.error;
}
if (record.status === 'success') {
return record.data;
}
}
async function fetchAndCache(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`Yuklashda xatolik yuz berdi, status: ${response.status}`);
}
const data = await response.json();
cache.set(url, { status: 'success', data });
} catch (e) {
cache.set(url, { status: 'error', error: e });
}
}
Bu o'ram har bir URL uchun oddiy holatni saqlaydi. fetchData
chaqirilganda, u holatni tekshiradi. Agar kutilayotgan bo'lsa, u promise'ni tashlaydi. Agar muvaffaqiyatli bo'lsa, u ma'lumotlarni qaytaradi. Endi, keling, UserProfile
komponentimizni shu yordamida qayta yozaylik.
// UserProfile.js
import React, { Suspense } from 'react';
import { fetchData } from './data-fetcher';
// Ma'lumotlarni haqiqatda ishlatadigan komponent
function ProfileDetails({ userId }) {
// Ma'lumotlarni o'qishga harakat qiling. Agar tayyor bo'lmasa, bu to'xtatib turadi.
const user = fetchData(`https://api.example.com/users/${userId}`);
return (
<div>
<h1>{user.name}</h1>
<p>Email: {user.email}</p>
</div>
);
}
// Yuklanish holati UI'sini belgilaydigan ota komponent
export function UserProfile({ userId }) {
return (
<Suspense fallback={<p>Profil yuklanmoqda...</p>}>
<ProfileDetails userId={userId} />
</Suspense>
);
}
Farqni ko'ring! ProfileDetails
komponenti toza va faqat ma'lumotlarni render qilishga qaratilgan. Unda isLoading
yoki error
holatlari yo'q. U shunchaki o'ziga kerakli ma'lumotlarni so'raydi. Yuklanish indikatorini ko'rsatish mas'uliyati ota komponent UserProfile
ga o'tkazilgan, u kutish paytida nima ko'rsatish kerakligini deklarativ ravishda bildiradi.
Murakkab Yuklanish Holatlarini Tashkil Etish
Suspense'ning haqiqiy kuchi bir nechta asinxron bog'liqliklarga ega murakkab UI'lar yaratganingizda namoyon bo'ladi.
Bosqichma-bosqich UI uchun Ichma-ich joylashgan Suspense Chegaralari
Siz yanada takomillashtirilgan yuklanish tajribasini yaratish uchun Suspense chegaralarini ichma-ich joylashtirishingiz mumkin. Yon panel, asosiy kontent maydoni va so'nggi faoliyatlar ro'yxati bo'lgan boshqaruv paneli sahifasini tasavvur qiling. Ularning har biri o'z ma'lumotlarini yuklashni talab qilishi mumkin.
function DashboardPage() {
return (
<div>
<h1>Boshqaruv paneli</h1>
<div className="layout">
<Suspense fallback={<p>Navigatsiya yuklanmoqda...</p>}>
<Sidebar />
</Suspense>
<main>
<Suspense fallback={<ProfileSkeleton />}>
<MainContent />
</Suspense>
<Suspense fallback={<ActivityFeedSkeleton />}>
<ActivityFeed />
</Suspense>
</main>
</div>
</div>
);
}
Ushbu tuzilma bilan:
Sidebar
o'z ma'lumotlari tayyor bo'lishi bilanoq paydo bo'lishi mumkin, hatto asosiy kontent hali yuklanayotgan bo'lsa ham.MainContent
vaActivityFeed
mustaqil ravishda yuklanishi mumkin. Foydalanuvchi har bir bo'lim uchun batafsil skelet yuklovchini ko'radi, bu esa bitta, butun sahifani qamrab oluvchi spinnerga qaraganda yaxshiroq kontekstni ta'minlaydi.
Bu sizga foydalanuvchiga foydali kontentni imkon qadar tezroq ko'rsatish imkonini beradi, bu esa sezilgan unumdorlikni keskin yaxshilaydi.
UI "Popkornlashuvi"dan Saqlanish
Ba'zan, bosqichma-bosqich yondashuv bir nechta spinnerlarning tez ketma-ketlikda paydo bo'lishi va yo'qolishi kabi noqulay effektga olib kelishi mumkin, bu effekt ko'pincha "popkornlashuv" deb ataladi. Buni hal qilish uchun siz Suspense chegarasini daraxtning yuqori qismiga ko'chirishingiz mumkin.
function DashboardPage() {
return (
<div>
<h1>Boshqaruv paneli</h1>
<Suspense fallback={<DashboardSkeleton />}>
<div className="layout">
<Sidebar />
<main>
<MainContent />
<ActivityFeed />
</main>
</div>
</Suspense>
</div>
);
}
Ushbu versiyada, bitta DashboardSkeleton
barcha ichki komponentlar (Sidebar
, MainContent
, ActivityFeed
) o'z ma'lumotlarini tayyor qilmaguncha ko'rsatiladi. Keyin butun boshqaruv paneli bir vaqtning o'zida paydo bo'ladi. Ichma-ich joylashgan chegaralar va bitta yuqori darajadagi chegara o'rtasidagi tanlov Suspense amalga oshirishni juda oson qiladigan UX dizayn qaroridir.
Xatolik Chegaralari bilan Xatolarni Boshqarish
Suspense promise'ning kutilayotgan holatini boshqaradi, lekin rad etilgan holati haqida nima deyish mumkin? Agar komponent tomonidan tashlangan promise rad etilsa (masalan, tarmoq xatosi), u React'dagi boshqa har qanday render xatosi kabi ko'rib chiqiladi.
Yechim - Xatolik Chegaralari (Error Boundaries)dan foydalanish. Xatolik Chegarasi bu maxsus hayotiy sikl usuli, componentDidCatch()
yoki statik usul getDerivedStateFromError()
ni belgilaydigan sinf komponentidir. U o'zining ichki komponentlar daraxtining istalgan joyida JavaScript xatolarini ushlaydi, bu xatolarni qayd etadi va zaxira UI'ni ko'rsatadi.
Mana oddiy Xatolik Chegarasi komponenti:
import React from 'react';
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false, error: null };
}
static getDerivedStateFromError(error) {
// Keyingi render zaxira UI'ni ko'rsatishi uchun holatni yangilang.
return { hasError: true, error: error };
}
componentDidCatch(error, errorInfo) {
// Siz xatoni xatoliklarni hisobot berish xizmatiga ham yuborishingiz mumkin
console.error("Xatolik ushlandi:", error, errorInfo);
}
render() {
if (this.state.hasError) {
// Siz har qanday maxsus zaxira UI'ni render qilishingiz mumkin
return <h1>Nimadir noto'g'ri ketdi. Iltimos, qayta urunib ko'ring.</h1>;
}
return this.props.children;
}
}
Keyin siz barcha uch holatni: kutilayotgan, muvaffaqiyatli va xatolikni boshqaradigan mustahkam tizim yaratish uchun Xatolik Chegaralarini Suspense bilan birlashtirishingiz mumkin.
import { Suspense } from 'react';
import ErrorBoundary from './ErrorBoundary';
import { UserProfile } from './UserProfile';
function App() {
return (
<div>
<h2>Foydalanuvchi Ma'lumotlari</h2>
<ErrorBoundary>
<Suspense fallback={<p>Yuklanmoqda...</p>}>
<UserProfile userId={123} />
</Suspense>
</ErrorBoundary>
</div>
);
}
Ushbu yondashuv bilan, agar UserProfile
ichidagi ma'lumotlarni yuklash muvaffaqiyatli bo'lsa, profil ko'rsatiladi. Agar u kutilayotgan bo'lsa, Suspense zaxirasi ko'rsatiladi. Agar u muvaffaqiyatsiz bo'lsa, Xatolik Chegarasining zaxirasi ko'rsatiladi. Mantiq deklarativ, kompozitsion va tushunish oson.
O'tishlar: Bloklanmaydigan UI Yangilanishlarining Kaliti
Boshqotirmaning oxirgi bir qismi bor. Boshqa foydalanuvchi profilini ko'rish uchun "Keyingi" tugmasini bosish kabi yangi ma'lumotlarni yuklashni boshlaydigan foydalanuvchi o'zaro ta'sirini ko'rib chiqing. Yuqoridagi sozlama bilan, tugma bosilib, userId
prop'i o'zgargan paytda, UserProfile
komponenti yana to'xtatib turiladi. Bu hozirda ko'rinib turgan profil yo'qolib, uning o'rniga yuklanish zaxirasi paydo bo'lishini anglatadi. Bu keskin va bezovta qiluvchi tuyulishi mumkin.
Bu yerda o'tishlar (transitions) yordamga keladi. O'tishlar React 18'dagi yangi xususiyat bo'lib, ular sizga ba'zi holat yangilanishlarini shoshilinch emas deb belgilash imkonini beradi. Holat yangilanishi o'tish bilan o'ralganda, React yangi kontentni fonda tayyorlayotganda eski UI'ni (eskirgan kontentni) ko'rsatishda davom etadi. U faqat yangi kontent ko'rsatishga tayyor bo'lgandagina UI yangilanishini amalga oshiradi.
Buning uchun asosiy API bu useTransition
hook'idir.
import React, { useState, useTransition, Suspense } from 'react';
import { UserProfile } from './UserProfile';
function ProfileSwitcher() {
const [userId, setUserId] = useState(1);
const [isPending, startTransition] = useTransition();
const handleNextClick = () => {
startTransition(() => {
setUserId(id => id + 1);
});
};
return (
<div>
<button onClick={handleNextClick} disabled={isPending}>
Keyingi Foydalanuvchi
</button>
{isPending && <span> Yangi profil yuklanmoqda...</span>}
<ErrorBoundary>
<Suspense fallback={<p>Dastlabki profil yuklanmoqda...</p>}>
<UserProfile userId={userId} />
</Suspense>
</ErrorBoundary>
</div>
);
}
Endi nima sodir bo'lishini ko'rib chiqamiz:
userId: 1
uchun dastlabki profil yuklanadi va Suspense zaxirasi ko'rsatiladi.- Foydalanuvchi "Keyingi Foydalanuvchi" tugmasini bosadi.
setUserId
chaqiruvistartTransition
bilan o'ralgan.- React xotirada yangi
userId
2 bo'lganUserProfile
ni render qilishni boshlaydi. Bu uni to'xtatib turishga olib keladi. - Muhimi, Suspense zaxirasini ko'rsatish o'rniga, React ekranda eski UI'ni (1-foydalanuvchi profilini) saqlab turadi.
useTransition
tomonidan qaytarilganisPending
mantiqiy qiymatitrue
ga aylanadi, bu bizga eski kontentni demontaj qilmasdan nozik, ichki yuklanish indikatorini ko'rsatish imkonini beradi.- 2-foydalanuvchi uchun ma'lumotlar yuklanib,
UserProfile
muvaffaqiyatli render qila olgandan so'ng, React yangilanishni amalga oshiradi va yangi profil silliq paydo bo'ladi.
O'tishlar nazoratning so'nggi qatlamini ta'minlab, sizga hech qachon keskin tuyulmaydigan murakkab va foydalanuvchiga qulay yuklanish tajribalarini yaratish imkonini beradi.
Eng Yaxshi Amaliyotlar va Global Mulohazalar
- Chegaralarni Strategik Joylashtiring: Har bir kichik komponentni Suspense chegarasi bilan o'ramang. Ularni ilovangizning foydalanuvchiga yuklanish holati mantiqiy bo'lgan nuqtalariga, masalan, sahifa, katta panel yoki muhim vidjetga joylashtiring.
- Mazmunli Zaxiralar Yarating: Umumiy spinnerlar oson, lekin yuklanayotgan kontentning shaklini taqlid qiladigan skelet yuklovchilar ancha yaxshi foydalanuvchi tajribasini ta'minlaydi. Ular layout siljishini kamaytiradi va foydalanuvchiga qanday kontent paydo bo'lishini kutishga yordam beradi.
- Maxsus Imkoniyatlarni (Accessibility) Hisobga Oling: Yuklanish holatlarini ko'rsatayotganda, ularning maxsus imkoniyatlarga ega foydalanuvchilar uchun qulay ekanligiga ishonch hosil qiling. Ekran o'quvchi foydalanuvchilarga kontent yangilanayotganini bildirish uchun kontent konteynerida
aria-busy="true"
kabi ARIA atributlaridan foydalaning. - Server Komponentlarini Qabul Qiling: Suspense bu React Server Komponentlari (RSC) uchun asosiy texnologiyadir. Next.js kabi freymvorklardan foydalanganda, Suspense sizga ma'lumotlar mavjud bo'lganda serverdan HTML'ni oqim bilan uzatish imkonini beradi, bu esa global auditoriya uchun juda tez dastlabki sahifa yuklanishlariga olib keladi.
- Ekosistemadan Foydalaning: Asosiy tamoyillarni tushunish muhim bo'lsa-da, ishlab chiqarish ilovalari uchun TanStack Query, SWR yoki Relay kabi sinovdan o'tgan kutubxonalarga tayaning. Ular keshlash, takrorlanishni oldini olish va boshqa murakkabliklarni boshqaradi va shu bilan birga uzluksiz Suspense integratsiyasini ta'minlaydi.
Xulosa
React Suspense shunchaki yangi xususiyatdan ko'proq narsani anglatadi; bu React ilovalarida asinxronlikka yondashuvimizdagi fundamental evolyutsiyadir. Qo'lda, imperativ yuklanish bayroqlaridan voz kechib, deklarativ modelni qabul qilish orqali biz toza, bardoshli va kompozitsiya qilish oson bo'lgan komponentlarni yozishimiz mumkin.
Kutilayotgan holatlar uchun <Suspense>
, muvaffaqiyatsizlik holatlari uchun Xatolik Chegaralari va uzluksiz yangilanishlar uchun useTransition
ni birlashtirib, sizning ixtiyoringizda to'liq va kuchli vositalar to'plami mavjud. Siz oddiy yuklanish spinnerlaridan tortib, murakkab, bosqichma-bosqich boshqaruv paneli ochilishlarigacha bo'lgan hamma narsani minimal, bashorat qilinadigan kod bilan tashkil qilishingiz mumkin. Loyihalaringizga Suspense'ni integratsiya qilishni boshlaganingizda, u nafaqat ilovangizning unumdorligi va foydalanuvchi tajribasini yaxshilashini, balki holatni boshqarish mantig'ingizni sezilarli darajada soddalashtirib, sizga haqiqatan ham muhim bo'lgan narsaga - ajoyib xususiyatlarni yaratishga e'tibor qaratish imkonini berishini ko'rasiz.