Component Composition — children, slot pattern
Muammo: qattiq bog'langan komponentlar
Modal yaratyapsiz. Birinchi versiya:
function Modal({ sarlavha, matn, tugmaMatni }) {
return (
<div className="modal">
<h2>{sarlavha}</h2>
<p>{matn}</p>
<button>{tugmaMatni}</button>
</div>
);
}
Ishlaydi. Lekin bir kuni modal ichiga forma kerak bo'ldi. Keyin rasm kerak bo'ldi. Keyin ikki tugma kerak bo'ldi. Har safar yangi props qo'shiladi — Modal tobora murakkablashadi.
Muammo: Modal nima ko'rsatilishini oldindan bilishga harakat qilmoqda. Bu noto'g'ri yondashuv.
Composition — Modal faqat "o'rov" bo'ladi. Ichiga nima solinishini tashqaridan belgilanadi.
children — asosiy composition usuli
function Modal({ sarlavha, children }) {
return (
<div className="modal-overlay">
<div className="modal">
<h2>{sarlavha}</h2>
<div className="modal-body">
{children} {/* tashqaridan berilgan kontent */}
</div>
</div>
</div>
);
}
Endi Modal ichiga istalgan narsa solinadi:
// Oddiy matn
<Modal sarlavha="Ogohlantirish">
<p>Haqiqatan o'chirmoqchimisiz?</p>
<button>Ha</button>
<button>Yo'q</button>
</Modal>
// Forma
<Modal sarlavha="Profil tahrirlash">
<form>
<input placeholder="Ism" />
<input placeholder="Email" />
<button type="submit">Saqlash</button>
</form>
</Modal>
// Rasm
<Modal sarlavha="Rasm ko'rish">
<img src="/rasm.jpg" alt="Rasm" style={{ width: '100%' }} />
</Modal>
Bir xil Modal — uch xil kontent. Modal o'zgarmadi.
Slot pattern — bir nechta joy
Ba'zan komponentda bir nechta "joy" kerak bo'ladi — sarlavha, kontent, footer alohida-alohida. children faqat bitta joy beradi. Slot pattern — bir nechta joy uchun.
function Karta({ sarlavha, kontent, footer }) {
return (
<div className="karta">
<div className="karta-sarlavha">
{sarlavha}
</div>
<div className="karta-kontent">
{kontent}
</div>
{footer && (
<div className="karta-footer">
{footer}
</div>
)}
</div>
);
}
<Karta
sarlavha={<h3>Foydalanuvchi</h3>}
kontent={
<div>
<p>Ali Valiyev</p>
<p>ali@gmail.com</p>
</div>
}
footer={
<div>
<button>Tahrirlash</button>
<button>O'chirish</button>
</div>
}
/>
Props sifatida JSX yuborilmoqda. Bu — slot pattern. Har bir "joy" alohida props orqali beriladi.
Composition ning kuchi
❌ Yomon — Modal hamma narsani biladi
<Modal
sarlavha="..."
matn="..."
tugma1Matni="..."
tugma1Rang="..."
tugma2Matni="..."
ikonaBormi={true}
ikonaUri="..."
/>
✅ Yaxshi — Modal faqat o'rov
<Modal sarlavha="...">
<p>Matn</p>
<img src="..." />
<div>
<button>Ha</button>
<button>Yo'q</button>
</div>
</Modal>
Birinchisida Modal 10 ta props oladi va hali ham yetmaydi. Ikkinchisida Modal 1 ta props oladi — istalgan kontent beriladi.
Amaliy misol — Layout
function Layout({ sidebar, children }) {
return (
<div className="layout">
<nav className="sidebar">
{sidebar}
</nav>
<main className="kontent">
{children}
</main>
</div>
);
}
// Ishlatish
<Layout
sidebar={
<ul>
<li>Bosh sahifa</li>
<li>Mahsulotlar</li>
<li>Sozlamalar</li>
</ul>
}
>
<h1>Mahsulotlar sahifasi</h1>
<MahsulotRoyxati />
</Layout>
Xulosa
Composition — komponentni "o'rov" qilib, ichiga nima solinishini tashqaridan belgilash.
children → bitta joy uchun
slot pattern → bir nechta joy uchun (props sifatida JSX)
Komponent qanchalik kam narsa bilsa — shunchalik moslashuvchan. Modal faqat "modal ko'rinishi" ni biladi, ichida nima borligini bilmaydi.
Keyingi dars
31-dars: Higher Order Component — HOC nima, qachon kerak