Props
Bir xil komponentni turli ma'lumotlar bilan ko'rsatishni istaymiz. Masalan, bitta Card komponenti turli ismlar bilan chiqishi kerak. Buning uchun React'da props (properties โ xossalar) mexanizmi mavjud. Ushbu darsda komponentga tashqaridan ma'lumot uzatishni o'rganamiz.
Props nima?
Props โ bu ota (parent) komponentdan bola (child) komponentga uzatiladigan ma'lumot. Ularni oddiy JavaScript funksiyasining argumentlari deb tasavvur qiling: siz komponentga qandaydir qiymat berasiz, u shu qiymatga qarab turlicha ko'rinadi.
Props'ni JSX'da xuddi HTML atributlari kabi yozamiz. Masalan, Salom komponentiga ism nomli prop uzatamiz:
<Salom ism="Ali" />
<Salom ism="Vali" />
Komponent ichida bu props'lar bitta obyekt sifatida keladi. Odat bo'yicha bu parametr props deb ataladi:
function Salom(props) {
return <h1>Salom, {props.ism}!</h1>;
}
// <Salom ism="Ali" /> => Salom, Ali!
// <Salom ism="Vali" /> => Salom, Vali!
Ya'ni ism="Ali" yozganda, komponent ichida props.ism qiymati "Ali" bo'ladi. Shu tariqa bitta komponent turli ma'lumotlar bilan ishlaydi.
Turli xil qiymatlarni uzatish
Props sifatida faqat matn emas, har qanday JavaScript qiymatini uzatish mumkin: son, mantiqiy qiymat, massiv, obyekt, hatto funksiya. Matn bo'lmagan qiymatlarni { } qavslar ichida beramiz:
<Profile
ism="Ali"
yosh={25}
faol={true}
qiziqishlar={["kod", "kitob"]}
/>
Komponent ichida esa ularni odatdagidek o'qiymiz:
function Profile(props) {
return (
<div>
<h2>{props.ism}, {props.yosh} yosh</h2>
<p>Holati: {props.faol ? "faol" : "nofaol"}</p>
<p>Qiziqishlar soni: {props.qiziqishlar.length}</p>
</div>
);
}
ism="Ali"), boshqa har qanday qiymatni qavs bilan (yosh={25}) beramiz. yosh="25" yozsangiz, bu son emas, matn bo'ladi!Props'ni destructuring qilish
Har safar props.ism, props.yosh deb yozish uzun bo'ladi. JavaScript'dan tanish destructuring yordamida buni qulaylashtiramiz. Odatda destructuring'ni to'g'ridan-to'g'ri funksiya parametrida bajaramiz:
function Profile({ ism, yosh, faol }) {
return (
<div>
<h2>{ism}, {yosh} yosh</h2>
<p>{faol ? "faol" : "nofaol"}</p>
</div>
);
}
Bu โ avvalgi kod bilan bir xil ishlaydi, faqat ancha toza va o'qilishi oson. Ko'pchilik React kodi aynan shu uslubda yoziladi.
Destructuring'da standart qiymat (default value) ham berish mumkin โ agar prop uzatilmasa, shu qiymat ishlatiladi:
function Tugma({ matn = "Bosing", turi = "oddiy" }) {
return <button className={turi}>{matn}</button>;
}
// <Tugma /> => matn: "Bosing", turi: "oddiy"
// <Tugma matn="Saqlash" /> => matn: "Saqlash"
children propi
Ba'zan komponentga oddiy atribut emas, balki uning teglari orasidagi kontentni uzatishni istaymiz โ xuddi HTML'da <div>...</div> ichiga narsa qo'ygan kabi. React buni maxsus children propi orqali beradi.
Masalan, Card komponenti โ bu ramka, uning ichiga istalgan kontent joylashtirmoqchimiz:
function Card({ children }) {
return <div className="card">{children}</div>;
}
Endi uni ochilib-yopiladigan teg sifatida ishlatamiz. Teglar orasidagi hamma narsa children bo'lib keladi:
function App() {
return (
<Card>
<h2>Sarlavha</h2>
<p>Bu โ karta ichidagi matn.</p>
</Card>
);
}
Natijada Card ichidagi {children} o'rniga <h2> va <p> chiqadi. Bu โ o'rovchi (wrapper) komponentlar yaratishning asosiy usuli: modal oynalar, panellar, ramkalar shu tariqa quriladi.
children โ bu React tomonidan avtomatik beriladigan maxsus prop. Siz uni qo'lda yozmaysiz โ u teglar orasidagi kontentdan to'ldiriladi.Props faqat o'qish uchun (immutable)
Bu โ React'ning eng muhim qoidalaridan biri: komponent o'z props'larini o'zgartira olmaydi. Props โ faqat o'qish uchun (read-only, immutable). Quyidagi kod qat'iyan man etiladi:
function Profile({ ism }) {
ism = "Boshqa ism"; // MUMKIN EMAS! Props'ni o'zgartirmang
return <h1>{ism}</h1>;
}
Nima uchun bunday qoida bor? React'da ma'lumot oqimi bir yo'nalishli (one-way data flow): ma'lumot yuqoridan (ota komponentdan) pastga (bola komponentga) oqadi. Agar bola o'z props'ini o'zgartira olsa, ma'lumot manbasi tushunarsiz bo'lib qolar va xatolarni topish qiyinlashardi.
React hujjatlarida buni shunday ifodalaydi: "Barcha React komponentlari o'z props'lariga nisbatan sof funksiya (pure function) kabi ishlashi kerak." Ya'ni bir xil props uchun har doim bir xil natija qaytarishi lozim.
Xulosa
- Props โ ota komponentdan bola komponentga uzatiladigan ma'lumot; funksiyaning argumentlariga o'xshaydi;
- Props JSX'da HTML atributlari kabi yoziladi: matn tirnoqda, boshqa qiymatlar
{ }qavsda; - Komponent ichida props'ni destructuring orqali qulay o'qiymiz:
function C({ ism }); - Standart qiymat berish mumkin:
{ matn = "Bosing" }; childrenโ teglar orasidagi kontentni uzatuvchi maxsus prop; o'rovchi komponentlar uchun ishlatiladi;- Props o'zgarmas (immutable, faqat o'qish uchun) โ ma'lumot bir yo'nalishli, yuqoridan pastga oqadi.