У JSX немає директив на кшталт v-if - умови пишуть звичайним JavaScript.
Тернарний оператор - один із двох варіантів:
{isLoggedIn ? <UserMenu /> : <LoginButton />}
&& - показати або нічого:
{hasError && <ErrorMessage />}
Ранній return - для цілих станів компонента:
if (isLoading) return <Spinner />;
if (!user) return null; // null - нічого не рендерити
return <Profile user={user} />;
Пастка з && і числами:
{items.length && <List items={items} />}
Якщо масив порожній, items.length дорівнює 0. Оператор && повертає ліву частину, коли вона хибна, - тобто 0. А React рендерить число 0 як текст. Користувач бачить загадковий «0» на сторінці.
React не рендерить лише null, undefined, false, true і порожній рядок. Число 0 і NaN він показує.
Як правильно:
{items.length > 0 && <List items={items} />}
{!!items.length && <List items={items} />}
{items.length ? <List items={items} /> : null}
Ліва частина && має бути логічним значенням, а не просто «чимось, що буває хибним».
Інші поради:
- складні умови - у змінну чи окремий компонент, а не вкладені тернарні оператори в JSX;
- мапа станів замість ланцюжка умов:
const content = {
loading: <Spinner />,
error: <ErrorMessage />,
empty: <EmptyState />,
}[status] ?? <List items={items} />;
- умова змінює дерево: якщо в гілках однакові компоненти на тому самому місці, React може зберегти їхній стан між гілками. Коли стан має скидатися, різні гілки отримують різний
key.
Приховати, а не прибрати - hidden чи CSS-клас: компонент і його стан лишаються. У React 19.2+ для цього є й <Activity mode="hidden">.