В Solid.js условный рендеринг применяется для управления тем, что отображается на странице в зависимости от состояния приложения. Это позволяет создавать динамичные интерфейсы, где контент меняется в ответ на изменения данных. В отличие от других фреймворков, таких как React, Solid.js использует декларативную модель с реактивной связью, что делает условный рендеринг ещё более эффективным.
В Solid.js условный рендеринг осуществляется с помощью реактивных
значений и выражений. Чтобы отобразить разные части интерфейса в
зависимости от состояния, обычно используются операторы if
и тернарные операторы.
Простой пример условного рендеринга:
import { createSignal } from 'solid-js';
function Example() {
const [isVisible, setIsVisible] = createSignal(false);
return (
<div>
{isVisible() ? <p>Элемент видим!</p> : <p>Элемент скрыт</p>}
<button onCl ick={() => setIsVisible(!isVisible())}>Переключить видимость</button>
</div>
);
}
Здесь состояние isVisible используется для определения
того, какой контент рендерить. В зависимости от его значения,
отображаются разные абзацы. При этом Solid.js автоматически отслеживает
изменения состояния и перерисовывает только те части интерфейса, которые
были затронуты, что обеспечивает высокую производительность.
Show для условного рендерингаДля более удобного и декларативного подхода Solid.js предоставляет
компонент Show. Этот компонент заменяет тернарный оператор
и делает код чище и понятнее. Он принимает два основных пропса:
when и children.
Пример использования:
import { Show, createSignal } from 'solid-js';
function Example() {
const [isVisible, setIsVisible] = createSignal(false);
return (
<div>
<Show when={isVisible()}>
<p>Элемент видим!</p>
</Show>
<Show when={!isVisible()}>
<p>Элемент скрыт</p>
</Show>
<button onCl ick={() => setIsVisible(!isVisible())}>Переключить видимость</button>
</div>
);
}
Компонент Show автоматически обрабатывает рендеринг в
зависимости от состояния. Он упрощает код и делает логику более
очевидной. В данном примере, как только состояние isVisible
изменяется, один из блоков рендерится, а другой скрывается. Этот подход
подходит для случаев, когда требуется рендерить один элемент при
истинном значении и другой — при ложном.
В случае, когда нужно отобразить несколько вариантов контента в
зависимости от условия, Solid.js предоставляет возможность вложенного
использования компонента Show. Это позволяет более гибко
управлять состоянием и рендерить различные компоненты.
Пример:
import { Show, createSignal } from 'solid-js';
function Example() {
const [userStatus, setUserStatus] = createSignal('loading');
return (
<div>
<Show when={userStatus() === 'loading'}>
<p>Загрузка...</p>
</Show>
<Show when={userStatus() === 'authenticated'}>
<p>Добро пожаловать!</p>
</Show>
<Show when={userStatus() === 'unauthenticated'}>
<p>Пожалуйста, войдите в систему</p>
</Show>
<button onCl ick={() => setUserStatus('authenticated')}>Войти</button>
<button onCl ick={() => setUserStatus('unauthenticated')}>Выйти</button>
</div>
);
}
В этом примере условный рендеринг применяется для отображения разных
сообщений в зависимости от статуса пользователя. Компоненты
Show проверяют значение состояния и рендерят
соответствующий контент.
ElseКомпонент Show также поддерживает атрибут
else, который позволяет задавать элемент, который будет
отображаться, если условие ложно.
Пример:
import { Show, createSignal } from 'solid-js';
function Example() {
const [isLoggedIn, setIsLoggedIn] = createSignal(false);
return (
<div>
<Show when={isLoggedIn()} fallback={<p>Вы не авторизованы</p>}>
<p>Добро пожаловать, пользователь!</p>
</Show>
<button onCl ick={() => setIsLoggedIn(!isLoggedIn())}>Переключить статус</button>
</div>
);
}
В этом примере атрибут fallback используется для того,
чтобы отобразить сообщение, когда условие isLoggedIn() не
выполняется. Это делает код еще более компактным и легким для чтения,
избегая необходимости писать явное условие для ложных состояний.
Solid.js также поддерживает условный рендеринг с асинхронными данными. В таких случаях часто используется реактивность для работы с промисами или асинхронными вызовами, которые могут изменить состояние в процессе выполнения.
Пример:
import { Show, createSignal, createEffect } from 'solid-js';
function Example() {
const [data, setData] = createSignal(null);
const [loading, setLoading] = createSignal(true);
createEffect(() => {
fetch('/api/data')
.then(response => response.json())
.then(fetchedData => {
setData(fetchedData);
setLoading(false);
});
});
return (
<div>
<Show when={loading()}>
<p>Загрузка...</p>
</Show>
<Show when={!loading()}>
<p>Данные: {JSON.stringify(data())}</p>
</Show>
</div>
);
}
В данном примере, пока данные загружаются, отображается сообщение “Загрузка…”. Как только загрузка завершена, рендерится сам контент. Этот подход удобен для работы с данными, полученными через API или другие асинхронные операции.
Условный рендеринг в Solid.js позволяет эффективно управлять
отображением элементов в зависимости от состояния приложения. Благодаря
компоненту Show, который является ключевым инструментом для
такой задачи, код остается лаконичным и читаемым. Использование
реактивных значений и оптимизированного рендеринга помогает избежать
лишних перерисовок, что особенно важно для производительных
интерфейсов.