Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Несколько вариантов: Switch и Match

Когда вариантов больше двух, вложенные Show становятся неудобными. Для выбора одной ветки из нескольких в Solid есть пара компонентов Switch и Match — аналог конструкции switch или цепочки if ... else if.

Switch и Match

Switch проверяет вложенные Match сверху вниз и выводит первый, у которого условие when истинно:

// src/components/TodoFilter.jsx
import { createSignal, Switch, Match } from 'solid-js';
 
export default function TodoFilter() {
  const [filter, setFilter] = createSignal('all');
 
  return (
    <div>
      <button onClick={() => setFilter('all')}>Все</button>
      <button onClick={() => setFilter('active')}>Активные</button>
      <button onClick={() => setFilter('done')}>Выполненные</button>
 
      <Switch>
        <Match when={filter() === 'all'}>
          <p>Показаны все задачи</p>
        </Match>
        <Match when={filter() === 'active'}>
          <p>Показаны активные задачи</p>
        </Match>
        <Match when={filter() === 'done'}>
          <p>Показаны выполненные задачи</p>
        </Match>
      </Switch>
    </div>
  );
}

Выведите <TodoFilter /> в src/App.jsx. Нажатие на кнопку меняет текст под кнопками, и на странице всегда виден только один абзац.

fallback

Если ни одно условие не подошло, Switch выводит содержимое атрибута fallback:

// src/components/TodoStatus.jsx
import { Switch, Match } from 'solid-js';
 
export default function TodoStatus(props) {
  return (
    <Switch fallback={<span>Неизвестно</span>}>
      <Match when={props.status === 'new'}>
        <span>Новая</span>
      </Match>
      <Match when={props.status === 'progress'}>
        <span>В работе</span>
      </Match>
      <Match when={props.status === 'done'}>
        <span>Готово</span>
      </Match>
    </Switch>
  );
}

Использование: <TodoStatus status="progress" /> покажет «В работе», а <TodoStatus status="paused" /> — «Неизвестно».

Применение фильтра к списку

Сам список удобнее фильтровать производной функцией, а Switch оставить для разной разметки:

// src/components/TodoFilter.jsx
const visible = () => {
  if (filter() === 'active') return todos().filter((t) => !t.done);
  if (filter() === 'done') return todos().filter((t) => t.done);
  return todos();
};

Затем <For each={visible()}> выведет только подходящие задачи.

Когда что использовать

СитуацияКомпонент
Показать или скрытьShow
Два вариантаShow с fallback
Три и больше вариантовSwitch и Match

Частая ошибка

Ставить внутрь Switch что-то кроме Match:

// src/components/TodoStatus.jsx
import { Switch, Match } from 'solid-js';
 
export default function TodoStatus(props) {
  return (
    <Switch>
      {/* Неправильно: обычный тег внутри Switch */}
      {/* <p>Статус:</p> */}
      <Match when={props.status === 'done'}>
        <span>Готово</span>
      </Match>
    </Switch>
  );
}

Switch понимает только Match. Общий текст вроде «Статус:» выносите за пределы Switch.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.