React kodida doimo uchraydigan JavaScript asoslari: destructuring, spread operator, array metodlar (map/filter/reduce), closures, optional chaining va async/await — har biri React kontekstida, test va mashqlar bilan.
React 100% JavaScript ustiga qurilgan. Bu bobda React kodida doimo uchraydigan JS conceptlarni React kontekstida ko'rib chiqamiz.
Destructuring — obyekt yoki massivdan qiymatlarni to'g'ridan-to'g'ri o'zgaruvchilarga ajratib olish usuli.
React'da deyarli har bir komponent props'ni destructuring orqali qabul qiladi — bu kodni qisqa va o'qilishi oson qiladi.
App.jsxReact JSXfunction UserCard({ name, age }) {return <p>{name} — {age}</p>;}
props obyektidan name va age maydonlari to'g'ridan-to'g'ri parametr sifatida ajratib olinadi — bu const { name, age } = props; yozishga teng.
... — obyekt yoki massivning barcha elementlarini "yoyib" yangi obyekt/massivga nusxalash uchun ishlatiladi.
React state'ni hech qachon mutate qilmaslik kerak. Spread operator eski qiymatlarni saqlab, faqat kerakli qismini o'zgartirgan holda yangi obyekt yaratish imkonini beradi.
App.jsxReact JSXconst user = { name: "Abbos", age: 26 };const updated = { ...user, age: 27 };
⚠️ Common Mistake
user.age = 27 deb to'g'ridan-to'g'ri o'zgartirish — bu mutation, React state uchun taqiqlangan.
map — har bir elementni o'zgartirib yangi massiv qaytaradi, filter — shartga mos elementlarni tanlaydi, reduce — massivni bitta qiymatga "yig'adi".
App.jsxReact JSXconst activeUsers = users.filter((u) => u.isActive);const total = cart.reduce((sum, item) => sum + item.price, 0);
React'da ro'yxatlarni render qilish uchun map, shartli ro'yxat uchun filter, savat narxini hisoblash uchun reduce doimiy ishlatiladi.
Closure — funksiya o'zi yaratilgan muhitdagi (scope) o'zgaruvchilarni "eslab qolishi".
🧠 Har bir render — funksiyaning yangi chaqiruvi, va shu chaqiruv ichidagi barcha o'zgaruvchilar shu render'ga "yopishib qoladi" (closure). Bu keyinchalik useEffect'dagi "stale closure" muammosini tushunish uchun juda muhim.
App.jsxReact JSXfunction useCounter() {let count = 0;function increment() {count++; // yopiq o'zgaruvchiga murojaat}return { count, increment };}
?. — obyekt ichidagi maydon mavjud bo'lmasa xatolik bermay undefined qaytaradi. async/await — Promise'lar bilan sinxron ko'rinishda ishlash imkonini beradi.
App.jsxReact JSXconst city = user?.address?.city ?? "Noma'lum";async function getUser() {const res = await fetch("/api/user");return await res.json();}
Task: { title, price } obyektidan destructuring qilib, <ProductCard> komponentiga prop sifatida uzating.
Hint: Funksiya parametrida to'g'ridan-to'g'ri destructuring qiling.
Task: users massividan yoshi 18dan katta bo'lganlarini filter qiling, keyin map bilan ismlarini ro'yxat qilib render qiling.
Hint: .filter().map() zanjiridan foydalaning.
Task: cart massividagi barcha mahsulotlar narxini reduce bilan jamlab, { ...state, total } orqali yangi state yarating (mutation'siz).
Hint: reducening ikkinchi argumenti — boshlang'ich qiymat (0).
App.jsxReact JSXconst user = { name: "Ali" };const updated = { ...user, name: "Vali" };console.log(user.name, updated.name);
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> Ali ValiWhy?
Spread operator yangi obyekt yaratadi, asl user o'zgarmaydi. Shuning uchun user.name hamon "Ali", updated.name esa "Vali".
App.jsxReact JSXconst [items, setItems] = useState([]);function addItem(item) {items.push(item);setItems(items);}
Your Task: Bu kod nega UI'ni yangilamaydi? Sababini tushuntiring va tuzating.
<details> <summary>Solution</summary> Muammo: `items.push(item)` — mavjud massivni mutate qiladi. React `setItems(items)` chaqirilganda, massiv reference'i o'zgarmagani uchun "yangi state" deb tanimasligi mumkin.Yechim:
</details>App.jsxReact JSXfunction addItem(item) {setItems([...items, item]);}
React kodi to'liq JavaScript ustida quriladi. Destructuring, spread, array metodlar, closures va async/await — bular React'ni tushunish uchun majburiy asos.
script.jsJavaScriptDestructuring: const { a, b } = obj;Spread: { ...obj, key: value } / [...arr, item]Filter+map: arr.filter(fn).map(fn)Optional chaining: obj?.prop?.nested ?? defaultAsync: const data = await fetch(url).then(r => r.json())
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: