useEffect'ning sinxronlashtirish mental modeli, dependency array, cleanup, data fetching, race condition va AbortController — chuqur test va debugging mashqlari bilan.
PART 0'dagi closures va async/await — useEffect'ni to'g'ri tushunish uchun zarur asos. Bu — handbookdagi eng muhim va murakkab boblardan biri.
Render jarayonining o'zi "toza" bo'lishi kerak — faqat UI hisoblab chiqarilishi kerak. Lekin real ilovalarda API so'rov yuborish, timer o'rnatish, event listener qo'shish kabi "React'dan tashqari dunyo bilan sinxronlashtirish" zarurati bor.
💡 Key Idea
useEffect — bu "data fetching uchun hook" emas, balki React komponentini tashqi tizim bilan sinxronlashtirish vositasi. Fetching — bu shu tashqi tizimlardan faqat bittasi.
App.jsxReact JSXuseEffect(() => {document.title = `${count} ta layk`;}, [count]); // faqat count o'zgarganda ishga tushadi
App.jsxReact JSXuseEffect(() => {const id = setInterval(() => {console.log("tick");}, 1000);return () => clearInterval(id); // cleanup: komponent unmount bo'lganda ishga tushadi}, []);
App.jsxReact JSXuseEffect(() => {async function loadUser() {const res = await fetch(`/api/users/${userId}`);const data = await res.json();setUser(data);}loadUser();}, [userId]);
App.jsxReact JSXuseEffect(() => {const controller = new AbortController();async function search() {try {const res = await fetch(`/api/search?q=${query}`, { signal: controller.signal });const data = await res.json();setResults(data);} catch (err) {if (err.name !== "AbortError") throw err;}}search();return () => controller.abort(); // eski so'rovni bekor qiladi}, [query]);
Task: Komponent yuklanganda konsolga "Komponent yuklandi" deb chiqaradigan effect yozing.
Task: Sekundomer (stopwatch) komponent — setInterval va cleanup bilan.
Task: Qidiruv maydoni — foydalanuvchi yozgan sari API'ga so'rov yuboradigan, lekin eski so'rovlarni bekor qiladigan (debounce + AbortController) komponent.
App.jsxReact JSXconst [count, setCount] = useState(0);useEffect(() => {setCount(count + 1);}, [count]);
🧠 Think first! Bu kod nima qiladi?
<details> <summary>Answer</summary> Cheksiz tsikl (infinite loop)!Why?
count o'zgaradi → effect qayta ishga tushadi → countni yana o'zgartiradi → va hokazo, chunki count ham dependency, ham effect ichida o'zgartirilmoqda.
App.jsxReact JSXuseEffect(() => {const id = setInterval(() => {console.log(count); // har doim boshlang'ich qiymatni chiqaradi}, 1000);}, []);
Your Task: Ikkita muammoni toping.
<details> <summary>Solution</summary> Ikki muammo bor: 1. `count` — stale closure, chunki dependency array bo'sh, effect faqat bir marta ishga tushadi va o'sha paytdagi `count`ni "eslab qoladi". 2. Cleanup yo'q — komponent unmount bo'lganda ham interval davom etaveradi (memory leak).Yechim:
</details>App.jsxReact JSXuseEffect(() => {const id = setInterval(() => {console.log(count);}, 1000);return () => clearInterval(id);}, [count]);
useEffect — komponentni tashqi tizimlar (API, DOM, timer, subscription) bilan sinxronlashtirish vositasi. Dependency array — effect qachon qayta ishga tushishini belgilaydi. Cleanup funksiya — resurslarni to'g'ri tozalash uchun zarur.
[]) — faqat mount'da bir marta ishga tushadiApp.jsxReact JSXuseEffect(() => {...}); // har render'dauseEffect(() => {...}, []); // faqat mount'dauseEffect(() => {...}, [dep]); // dependency asosidauseEffect(() => { return () => {...}; }, []); // cleanup bilan
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: