Encodera

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

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

Оглавление

Условия: блок if

Часто часть страницы нужно показывать только при каком-то условии: сообщение «Список пуст», кнопку для вошедшего пользователя, ошибку формы. В разметке Svelte для этого есть блок {#if}.

Блок if

Блок открывается тегом {#if условие} и закрывается {/if}:

<!-- src/routes/+page.svelte -->
<script>
  let todos = $state([]);
</script>
 
{#if todos.length === 0}
  <p>Список пуст. Добавьте первую задачу.</p>
{/if}
 
<button onclick={() => todos.push({ id: Date.now(), text: 'Новая', done: false })}>
  Добавить
</button>

Пока задач нет, на странице видна подсказка. После клика по «Добавить» условие становится ложным, и абзац исчезает из DOM — он не скрывается стилем, а удаляется полностью.

Ветка else

Для второго варианта добавьте :

<script>
  let todos = $state([]);
</script>
 
{#if todos.length === 0}
  <p>Список пуст.</p>
{:else}
  <p>Задач в списке: {todos.length}</p>
{/if}

На странице всегда виден ровно один из двух абзацев.

Несколько условий

Ветка {:else if ...} проверяет следующее условие, если предыдущие не подошли:

<script>
  let todos = $state([
    { id: 1, text: 'Купить хлеб', done: true },
    { id: 2, text: 'Позвонить Олегу', done: false }
  ]);
  let remaining = $derived(todos.filter((todo) => !todo.done).length);
</script>
 
{#if todos.length === 0}
  <p>Список пуст.</p>
{:else if remaining === 0}
  <p>Всё сделано!</p>
{:else}
  <p>Осталось: {remaining}</p>
{/if}

Сейчас страница покажет «Осталось: 1». Отметьте вторую задачу выполненной — текст сменится на «Всё сделано!».

Синтаксис блоков

СимволЗначениеПример
#открывает блок{#if ok}
:продолжает блок
/закрывает блок{/if}

Тот же порядок символов встретится в блоках each и await.

Короткие условия

Для простого случая можно обойтись выражением: {remaining > 0 ? 'Есть дела' : 'Свободен'}. Блок {#if} нужен, когда в зависимости от условия меняется разметка, а не только текст.

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

Писать else без двоеточия или забыть закрыть блок:

<script>
  let ok = $state(true);
</script>
 
{#if ok}
  <p>Да</p>
{else}
  <p>Нет</p>

Компилятор сообщит об ошибке. Правильно — внутри блока и обязательный {/if} в конце.

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

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