React: shartli ko'rinish
Forma darsida xato xabarini {error && <p>...</p>} deb
chiqardik. Bu naqsh React’da har qadamda uchraydi: yuklanmoqda belgisi,
bo’sh ro’yxat xabari, tizimga kirgan foydalanuvchi menyusi. Bu darsda
uning to’liq qoidalarini va bitta xavfli tuzog’ini ko’ramiz.
&& — shart bajarilsa ko’rsatish
Eng qisqa usul:
function TaskList({ tasks, error }) {
return (
<div>
{error && <p className="error">{error}</p>}
<ul>
{tasks.map((task) => (
<li key={task.id}>{task.title}</li>
))}
</ul>
</div>
);
}
error bo’sh matn bo’lsa xabar chiqmaydi. Matn bo’lsa — chiqadi.
Ishlash mantig’i sof JavaScript:
// && chap tomon yolg'on bo'lsa, o'sha qiymatni qaytaradi
false && <p>Xato</p> // → false
"" && <p>Xato</p> // → ""
"Xato yuz berdi" && <p>Xato</p> // → <p>Xato</p>
JSX darsidagi jadvalni eslang: false, null,
undefined va "" ekranda hech nima chizmaydi. Shuning uchun shart
bajarilmaganda joy bo’sh qoladi.
Nol tuzog’i
Endi eng ko’p chalkashtiradigan joy. Ro’yxatdagi vazifalar sonini ko’rsatmoqchisiz:
// ❌ Tuzoq
function TaskList({ tasks }) {
return (
<div>
{tasks.length && <p>Jami: {tasks.length} ta vazifa</p>}
</div>
);
}
Ro’yxat to’la bo’lsa hammasi joyida. Ro’yxat bo’sh bo’lsa ekranda kutilmagan narsa paydo bo’ladi:
<div>0</div>
Ekranda yolg’iz 0 turadi.
Uch yechim bor:
// ✅ 1. Aniq taqqoslash — eng yaxshisi
{tasks.length > 0 && <p>Jami: {tasks.length} ta vazifa</p>}
// ✅ 2. Mantiqiy qiymatga aylantirish
{Boolean(tasks.length) && <p>Jami: {tasks.length} ta vazifa</p>}
// ✅ 3. Ternar operator
{tasks.length ? <p>Jami: {tasks.length} ta vazifa</p> : null}
Birinchisi afzal: u niyatni aniq ko’rsatadi va qo’shimcha funksiya talab qilmaydi.
Qoidani shunday eslang: && chap tomonida doim mantiqiy qiymat
tursin. Son bo’lsa > 0, massiv bo’lsa .length > 0, obyekt bo’lsa
!== null.
Ternar — ikki variantdan biri
Shart bajarilsa bir narsa, bajarilmasa boshqasi kerak bo’lsa:
function UserGreeting({ user }) {
return (
<div>
{user ? (
<p>Xush kelibsiz, {user.name}!</p>
) : (
<button type="button">Tizimga kirish</button>
)}
</div>
);
}
user bo’lsa salomlashuv, bo’lmasa tugma chiqadi.
Ternar atribut ichida ham ishlatiladi — bu juda keng tarqalgan:
<li className={task.isDone ? "done" : "active"}>{task.title}</li>
<button type="button" disabled={isLoading ? true : false}>Yuborish</button>
Ikkinchi misolda ternar ortiqcha — disabled={isLoading} yetarli.
Mantiqiy qiymatni ternar bilan mantiqiy qiymatga aylantirish keraksiz
ish.
JSX’ni o’zgaruvchiga saqlash
Shart murakkab bo’lsa, JSX’ni oldindan tayyorlang:
function TaskList({ tasks, isLoading, error }) {
let content;
if (isLoading) {
content = <p>Yuklanmoqda...</p>;
} else if (error) {
content = <p className="error">{error}</p>;
} else if (tasks.length === 0) {
content = <p>Hozircha vazifa yo'q.</p>;
} else {
content = (
<ul>
{tasks.map((task) => (
<li key={task.id}>{task.title}</li>
))}
</ul>
);
}
return (
<section>
<h2>Vazifalar</h2>
{content}
</section>
);
}
export default TaskList;
Bu yerda if/else ishlatilyapti, chunki u JSX’dan tashqarida
turibdi. JSX ichida if yozib bo’lmasligini
JSX darsida ko’rgansiz.
To’rt holat aniq ajratilgan va har birini alohida o’qish mumkin. Aynan shu tuzilma serverdan ma’lumot yuklash darsida asosiy naqsh bo’ladi.
Ertaroq qaytarish
Komponent butunlay boshqa narsa ko’rsatishi kerak bo’lsa, darrov qaytaring:
function TaskList({ tasks, isLoading }) {
if (isLoading) {
return <p>Yuklanmoqda...</p>;
}
if (tasks.length === 0) {
return <p>Hozircha vazifa yo'q. Birinchisini qo'shing.</p>;
}
return (
<ul>
{tasks.map((task) => (
<li key={task.id}>{task.title}</li>
))}
</ul>
);
}
Asosiy holat oxirida qoladi va u ichma-ich shartlarga o’ralmaydi.
null qaytarish — hech nima ko’rsatmaslik
Komponent ba’zan umuman ko’rinmasligi kerak:
function Notification({ message }) {
if (!message) {
return null;
}
return <div className="notification">{message}</div>;
}
export default Notification;
null qaytarish — “men bu safar hech nima chizmayman” degani.
Komponent o’zi yashab turadi, holati saqlanadi, faqat DOM’da iz
qoldirmaydi.
Ro’yxatni filtrlash
Shartli ko’rinishning keng tarqalgan qo’llanishi — filtr tugmalari:
import { useState } from 'react';
const tasks = [
{ id: 1, title: "Non olish", isDone: false },
{ id: 2, title: "Kitob o'qish", isDone: true },
{ id: 3, title: "Xat yozish", isDone: false },
];
function TaskList() {
const [filter, setFilter] = useState("all");
const visibleTasks = tasks.filter((task) => {
if (filter === "active") return !task.isDone;
if (filter === "done") return task.isDone;
return true;
});
return (
<div>
<button type="button" onClick={() => setFilter("all")}>
Hammasi
</button>
<button type="button" onClick={() => setFilter("active")}>
Faol
</button>
<button type="button" onClick={() => setFilter("done")}>
Bajarilgan
</button>
{visibleTasks.length > 0 ? (
<ul>
{visibleTasks.map((task) => (
<li key={task.id}>{task.title}</li>
))}
</ul>
) : (
<p>Bu filtrga mos vazifa yo'q.</p>
)}
</div>
);
}
export default TaskList;
“Faol” tugmasini bosing — ikkita vazifa qoladi. “Bajarilgan” — bittasi.
visibleTasks holatda saqlanmaydi, har chizishda tasks va filter
dan hisoblanadi. Bu muhim naqsh: boshqa holatdan hisoblash mumkin
bo’lgan narsani holatda saqlamang. Aks holda ikkalasini mos ushlab
turish kerak bo’ladi — bu React nima darsidagi
muammoning qaytishi.
Qaysi usulni tanlash
| Holat | Usul |
|---|---|
| Bor bo’lsa ko’rsat | {value && <div />} |
| Ikki variantdan biri | {cond ? <A /> : <B />} |
| Uch va undan ko’p holat | if/else + o’zgaruvchi |
| Butunlay boshqa ko’rinish | Ertaroq return |
| Hech nima ko’rsatmaslik | return null |
| Atribut qiymati | Ternar yoki to’g’ridan-to’g’ri qiymat |
Amaliy mashq
Notificationkomponentini yozing:messagebo’sh bo’lsanullqaytarsin.{tasks.length && <p>Jami: {tasks.length}</p>}deb yozing vatasksni bo’sh massivga almashtiring. Ekranda0chiqqanini ko’ring.- Uni
tasks.length > 0 &&ga tuzatib,0yo’qolganini tekshiring. TaskListniisLoading,errorva bo’sh ro’yxat holatlarini qamraydigan qilibif/elsebilan yozing.- Filtr tugmalarini qo’shing va har filtrda nechta vazifa qolayotganini sanang.
useStateqatorini ertaroqreturndan keyinga ko’chiring, chiqqan xatoni o’qing va qaytaring.
2-qadam bu darsning asosiy sababi: 0 ekranda paydo bo’lganda sababini
bilmasangiz, uni qidirish ko’p vaqt oladi.
Qisqacha xulosa
{shart && <div />}— shart bajarilsa ko’rsatadi, aks holda joy bo’sh qoladi.{0 && <div />}ekranda0chizadi —&&chap tomondagi yolg’on qiymatning o’zini qaytaradi,0esa ko’rinadigan qiymat; yechim — chap tomonda doim mantiqiy qiymat tursin:tasks.length > 0.- Ternar ikki variantdan birini tanlaydi va atribut ichida ham ishlaydi; ichma-ich yozilmaydi.
- Uch va undan ko’p holatda JSX’ni o’zgaruvchiga saqlang yoki ertaroq
returnishlating. - Ertaroq
returnhook’lardan keyin turishi shart. return null— komponent bu safar hech nima chizmaydi.- Hisoblash mumkin bo’lgan qiymatni (
visibleTasks) holatda saqlamang.
Keyingi darsda useEffect — React’dan tashqaridagi ishlar: timer, brauzer API va tarmoq so’rovi.