Component — nima, Function Component, nima uchun kichik bo'laklarga bo'lamiz
Muammodan boshlaylik
Tasavvur qiling — e-commerce sayt yozyapsiz. Mahsulotlar sahifasi bor. Har bir mahsulotning rasmi, nomi, narxi, reytingi, "Savatga qo'shish" tugmasi bor. 50 ta mahsulot bor.
Komponentlarsiz bu shunday ko'rinadi:
function App() {
return (
<div>
<div className="card">
<img src="noutbuk.jpg" />
<h3>Noutbuk</h3>
<p>8 500 000 so'm</p>
<div>⭐⭐⭐⭐⭐</div>
<button>Savatga qo'shish</button>
</div>
<div className="card">
<img src="telefon.jpg" />
<h3>Telefon</h3>
<p>3 200 000 so'm</p>
<div>⭐⭐⭐⭐</div>
<button>Savatga qo'shish</button>
</div>
{/* yana 48 ta shunday blok... */}
</div>
);
}
Muammolar:
- Bir xil kod 50 marta takrorlanadi
- Bitta joyni o'zgartirish kerak bo'lsa — 50 ta joyni o'zgartirish kerak
- Fayl minglab qatorga yetadi, o'qib bo'lmaydi
- Bir kishi "Savatga qo'shish" tugmasini o'zgartirsa, boshqasi boshqa joyni o'zgartirsa — conflict
Component nima?
Component — bu UI ning qayta ishlatiluvchi bo'lagi. Bir marta yozasiz, istalgan joyda ishlatasiz.
Yuqoridagi muammo komponent bilan:
function MahsulotKarta({ rasm, nom, narx, reyting }) {
return (
<div className="card">
<img src={rasm} />
<h3>{nom}</h3>
<p>{narx.toLocaleString()} so'm</p>
<div>{'⭐'.repeat(reyting)}</div>
<button>Savatga qo'shish</button>
</div>
);
}
function App() {
return (
<div>
<MahsulotKarta rasm="noutbuk.jpg" nom="Noutbuk" narx={8500000} reyting={5} />
<MahsulotKarta rasm="telefon.jpg" nom="Telefon" narx={3200000} reyting={4} />
<MahsulotKarta rasm="quloqchin.jpg" nom="Quloqchin" narx={450000} reyting={4} />
</div>
);
}
Endi "Savatga qo'shish" tugmasini o'zgartirish kerak bo'lsa — faqat MahsulotKarta ichida bir joyni o'zgartirish yetarli. Hamma joyda avtomatik yangilanadi.
Function Component qanday yoziladi?
React da komponent — bu oddiy JavaScript funksiyasi. Ikkita qoidasi bor:
- Nomi katta harf bilan boshlanishi kerak
- JSX qaytarishi kerak
// ✅ To'g'ri — katta harf bilan boshlanadi
function Salom() {
return <h1>Salom, dunyo!</h1>;
}
// ✅ Arrow function ham bo'ladi
const Salom = () => {
return <h1>Salom, dunyo!</h1>;
};
// ✅ Qisqa yozuv — faqat bitta ifoda bo'lsa
const Salom = () => <h1>Salom, dunyo!</h1>;
// ❌ Xato — kichik harf bilan boshlanadi
function salom() {
return <h1>Salom</h1>;
}
// React buni HTML tegi deb o'ylaydi, komponent sifatida ishlatmaydi
Nima uchun katta harf? React JSX da <div> va <Salom> ni farqlashi kerak. Kichik harf — HTML tegi, katta harf — React komponenti.
Komponentni ishlatish
Komponent yozilgandan keyin uni boshqa komponent ichida HTML tegi kabi ishlatiladi:
function Sarlavha() {
return <h1>DevDocs</h1>;
}
function Tugma() {
return <button>Bosing</button>;
}
function App() {
return (
<div>
<Sarlavha />
<Tugma />
<Tugma /> {/* bir xil komponentni ko'p marta ishlatish mumkin */}
<Tugma />
</div>
);
}
Nima uchun kichik bo'laklarga bo'lamiz?
Komponentlarni kichik qilish — bu faqat "tartib uchun" emas. Buning aniq sabablari bor.
1. Qayta ishlatish
Bir marta yozilgan komponent loyihaning istalgan joyida ishlatiladi. Tugma komponentini yozdingiz — uni forma ichida, modal ichida, navbar da ishlatasiz.
2. Mustaqil o'zgartirish
Katta komponentda biror narsani o'zgartirish — butun komponentni qayta chizishga olib keladi. Kichik komponentda faqat o'sha kichik qism qayta chiziladi.
3. Jamoa bilan ishlash
Bir kishi Navbar ni yozadi, boshqasi Sidebar ni, uchinchisi MahsulotKarta ni — bir vaqtda, bir-biriga tegmay.
4. Test qilish osonligi
Kichik komponentni alohida test qilish mumkin. Katta komponentni test qilish qiyin.
Qanday bo'laklarga bo'lish kerak?
Qoida oddiy: bitta komponent — bitta vazifa.
❌ Yomon — hamma narsa bitta komponentda
App
└── (navbar, sidebar, mahsulotlar, footer — hammasi)
✅ Yaxshi — har biri alohida
App
├── Navbar
├── Sidebar
├── MahsulotlarRoyxati
│ └── MahsulotKarta (har bir mahsulot uchun)
└── Footer
Komponentni bo'lish vaqti keldi degan belgilar:
- Bir xil kod ikki joyda takrorlanmoqda → alohida komponent
- Komponent 100 qatordan oshdi → bo'lish vaqti
- Komponent ichida aniq ajraladigan qismlar bor → bo'lish mumkin
Fayl tuzilishi
Har bir komponent odatda alohida faylda bo'ladi:
src/
├── components/
│ ├── Navbar.jsx
│ ├── Sidebar.jsx
│ ├── MahsulotKarta.jsx
│ └── Tugma.jsx
├── pages/
│ ├── Bosh.jsx
│ └── Mahsulotlar.jsx
└── App.jsx
// src/components/MahsulotKarta.jsx
function MahsulotKarta({ rasm, nom, narx }) {
return (
<div className="card">
<img src={rasm} alt={nom} />
<h3>{nom}</h3>
<p>{narx.toLocaleString()} so'm</p>
</div>
);
}
export default MahsulotKarta;
// src/pages/Mahsulotlar.jsx
import MahsulotKarta from '../components/MahsulotKarta';
function Mahsulotlar() {
return (
<div>
<MahsulotKarta nom="Noutbuk" narx={8500000} />
</div>
);
}
export default Mahsulotlar;
Xulosa
Component — UI ning qayta ishlatiluvchi bo'lagi. Bir marta yoziladi, ko'p joyda ishlatiladi.
- Funksiya nomi katta harf bilan boshlanadi
- JSX qaytaradi
- Kichik bo'laklarga bo'lish: qayta ishlatish, mustaqil o'zgartirish, jamoa bilan ishlash uchun
- Bitta komponent — bitta vazifa
Keyingi dars
6-dars: Props — yuborish, qabul qilish, default qiymat, children