JSX — nima, JavaScript dan farqi, qoidalar
Muammo: JavaScript da UI yozish og'ir
Tasavvur qiling — foydalanuvchi kartochkasini ekranda ko'rsatmoqchisiz. Ism, yosh, email. Vanilla JavaScript da bu shunday yoziladi:
const card = document.createElement('div');
card.className = 'card';
const ism = document.createElement('h2');
ism.textContent = 'Ali Valiyev';
const yosh = document.createElement('p');
yosh.textContent = '25 yosh';
const email = document.createElement('p');
email.textContent = 'ali@gmail.com';
card.appendChild(ism);
card.appendChild(yosh);
card.appendChild(email);
document.body.appendChild(card);
Bu 12 qator kod — faqat 3 ta maydon uchun. Kodni o'qib, qanday ko'rinishini tasavvur qilish ham qiyin. Agar 10 ta maydon bo'lsa — 40 qator.
React dastlab bu muammoni React.createElement bilan hal qildi:
const card = React.createElement(
'div',
{ className: 'card' },
React.createElement('h2', null, 'Ali Valiyev'),
React.createElement('p', null, '25 yosh'),
React.createElement('p', null, 'ali@gmail.com')
);
Yaxshiroq, lekin hali ham o'qish qiyin. Shuning uchun JSX yaratildi.
JSX nima?
JSX — JavaScript ichida HTML ga o'xshash sintaksis yozish imkonini beradi. Yuqoridagi kod JSX da shunday ko'rinadi:
const card = (
<div className="card">
<h2>Ali Valiyev</h2>
<p>25 yosh</p>
<p>ali@gmail.com</p>
</div>
);
Ancha o'qilishi oson. Qanday ko'rinishini darhol tasavvur qilish mumkin.
Lekin muhim narsa: brauzer JSX ni tushunmaydi. Vite bu kodni brauzerga yetib borishidan oldin React.createElement ga aylantiradi. Ya'ni siz JSX yozsangiz ham, oxirida brauzerda oddiy JavaScript ishlaydi.
JSX — yangi til emas. Bu JavaScript ning kengaytmasi, "sintaktik shakar" deyiladi. Yozish qulay, lekin ichida oddiy JavaScript.
JSX qoidalari
1. Bitta ildiz element bo'lishi shart
Funksiya bitta qiymat qaytaradi — xuddi shunday JSX ham bitta element qaytarishi kerak. Ikki element yonma-yon qaytarib bo'lmaydi.
// ❌ Xato — ikki element yonma-yon
function App() {
return (
<h1>Sarlavha</h1>
<p>Paragraf</p>
);
}
Xato xabari:
Adjacent JSX elements must be wrapped in an enclosing tag
Yechim — ularni bitta elementga o'rash:
// ✅ div ichiga o'rash
function App() {
return (
<div>
<h1>Sarlavha</h1>
<p>Paragraf</p>
</div>
);
}
Lekin bu yerda muammo bor — keraksiz div DOM ga qo'shiladi. Ba'zan bu CSS layout ni buzadi. Buning uchun Fragment bor:
// ✅ Fragment — DOM ga hech narsa qo'shmaydi
function App() {
return (
<>
<h1>Sarlavha</h1>
<p>Paragraf</p>
</>
);
}
<>...</> — bu <React.Fragment>...</React.Fragment> ning qisqa yozuvi. Brauzerda hech qanday element yaratmaydi, faqat React uchun "o'rov" vazifasini bajaradi.
2. class emas — className
HTML da elementga stil berish uchun class atributi ishlatiladi. Lekin JavaScript da class — kalit so'z (sinflar uchun). Shuning uchun JSX da className yoziladi.
// ❌ Xato
<div class="card">...</div>
// ✅ To'g'ri
<div className="card">...</div>
Agar class yozsangiz, React warning beradi va ishlaydi — lekin bu noto'g'ri. className yozing.
Xuddi shunday, for ham JavaScript da kalit so'z — htmlFor ishlatiladi:
// ❌ Xato
<label for="email">Email</label>
// ✅ To'g'ri
<label htmlFor="email">Email</label>
3. Barcha teglar yopilishi kerak
HTML da ba'zi teglar yopilmaydi — <br>, <img>, <input>. Brauzer ularni tushunadi. Lekin JSX da qat'iy qoida: barcha teglar yopilishi shart.
// ❌ Xato
<br>
<img src="rasm.jpg">
<input type="text">
// ✅ To'g'ri — self-closing
<br />
<img src="rasm.jpg" />
<input type="text" />
4. JavaScript ifodalar {} ichida yoziladi
JSX ichida JavaScript yozmoqchi bo'lsangiz — {} ichiga yozing. Bu "bu yerda JavaScript bor" degan signal.
const ism = 'Ali';
const yosh = 25;
const faol = true;
function App() {
return (
<div>
<h2>{ism}</h2>
<p>{yosh} yosh</p>
<p>{ism.toUpperCase()}</p>
<p>{2 + 2}</p>
<p>{faol ? 'Faol' : 'Faol emas'}</p>
</div>
);
}
{} ichida ifoda (expression) yoziladi — qiymat qaytaradigan narsa. if, for, while kabi operatorlar yozib bo'lmaydi, chunki ular qiymat qaytarmaydi.
// ❌ Xato — if operator, qiymat qaytarmaydi
<p>{if (yosh > 18) { 'Katta' }}</p>
// ✅ To'g'ri — ternary operator, qiymat qaytaradi
<p>{yosh > 18 ? 'Katta' : 'Kichik'}</p>
5. Stil — ob'ekt sifatida
HTML da stil string sifatida yoziladi: style="color: red". JSX da esa stil — JavaScript ob'ekti.
// ❌ Xato — string sifatida
<div style="color: red; font-size: 16px">...</div>
// ✅ To'g'ri — ob'ekt sifatida
<div style={{ color: 'red', fontSize: '16px' }}>...</div>
Tashqi {} — "bu yerda JavaScript bor" degan signal. Ichki {} — ob'ekt.
CSS xususiyat nomlari camelCase da yoziladi, chunki JavaScript da - belgisi ayirish operatori:
font-size → fontSize
background-color → backgroundColor
margin-top → marginTop
border-radius → borderRadius
Stillarni alohida o'zgaruvchiga chiqarish ham mumkin:
const cardStil = {
backgroundColor: '#f5f5f5',
padding: '20px',
borderRadius: '8px',
};
<div style={cardStil}>...</div>
6. Izohlar
JSX ichida oddiy // yoki /* */ izoh ishlamaydi. {/* */} ishlatiladi:
function App() {
return (
<div>
{/* Bu JSX izohi */}
<h1>Salom</h1>
{/* <p>Bu vaqtincha o'chirilgan</p> */}
</div>
);
}
Tez-tez uchraydigan xatolar
Ob'ektni to'g'ridan-to'g'ri render qilish:
Siz ma'lumotlar bazasidan ob'ekt oldingiz va uni ekranda ko'rsatmoqchisiz:
const user = { name: 'Ali', age: 25 };
// ❌ Xato
<p>{user}</p>
Xato xabari:
Objects are not valid as a React child
React ob'ektni qanday ko'rsatishni bilmaydi. Aniq maydonni ko'rsating:
// ✅ To'g'ri
<p>{user.name}</p>
<p>{user.age}</p>
undefined yoki null ko'rsatish:
const ism = undefined;
<p>{ism}</p> // hech narsa ko'rsatmaydi — bu normal
undefined, null, false — JSX da hech narsa ko'rsatmaydi. Bu ba'zan foydali (conditional rendering uchun), ba'zan kutilmagan natija beradi. Agar "undefined" matni ko'rsatmoqchi bo'lsangiz — String(ism) yoki ism ?? 'Noma\'lum' ishlating.
Qavslarni unutish:
// ❌ Bu matn sifatida ko'rsatiladi: "yosh"
<p>yosh</p>
// ✅ Bu o'zgaruvchi qiymati ko'rsatiladi
<p>{yosh}</p>
Xulosa
JSX — JavaScript ichida HTML yozish imkonini beruvchi sintaksis. Brauzer uni tushunmaydi — Vite React.createElement ga aylantiradi.
Asosiy qoidalar:
- Bitta ildiz element — yoki
<>...</>Fragment class→className,for→htmlFor- Barcha teglar yopiladi:
<br />,<img /> - JavaScript
{}ichida yoziladi - Stil — ob'ekt sifatida, camelCase
Keyingi dars
4-dars: JSX — expression, conditional rendering, list rendering