Перейти к содержимому

<svelte:boundary>

<svelte:boundary onerror={handler}>...</svelte:boundary>

Границы позволяют «отделить» части вашего приложения, чтобы вы могли:

  • отображать интерфейс, который должен показываться во время первоначального выполнения await-выражений
  • обрабатывать ошибки, возникающие при рендеринге или выполнении эффектов, и предоставлять интерфейс для отображения при возникновении ошибки

Если граница обрабатывает ошибку (с помощью сниппета failed или обработчика onerror, или обоих), её текущее содержимое будет удалено.

Чтобы граница выполняла свою функцию, должен быть предоставлен хотя бы один из следующих элементов.

Начиная со Svelte 5.36, границы со сниппетом pending могут содержать выражения await. Этот сниппет будет отображаться при создании границы и останется видимым, пока все выражения await внутри границы не будут выполнены (демонстрация):

<svelte:boundary>
<p>{await delayed('привет!')}</p>
{#snippet pending()}
<p>загрузка...</p>
{/snippet}
</svelte:boundary>

Если предусмотрен сниппет failed, он будет отображаться при возникновении ошибки внутри границы, получая доступ к объекту error и функции reset для повторного создания содержимого (демонстрация):

<svelte:boundary>
<FlakyComponent />
{#snippet failed(error, reset)}
<button onclick={reset}>упс! попробовать ещё раз</button>
{/snippet}
</svelte:boundary>

Если предоставлена функция onerror, она будет вызвана с теми же двумя аргументами: error и reset. Это полезно для отслеживания ошибок с помощью сервиса отчётов об ошибках…

<svelte:boundary onerror={(e) => report(e)}>
...
</svelte:boundary>

…или для использования error и reset за пределами самой границы:

<script>
let error = $state(null);
let reset = $state(() => {});
function onerror(e, r) {
error = e;
reset = r;
}
</script>
<svelte:boundary {onerror}>
<FlakyComponent />
</svelte:boundary>
{#if error}
<button onclick={() => {
error = null;
reset();
}}>
упс! попробовать ещё раз
</button>
{/if}

Если ошибка происходит внутри функции onerror (или если вы повторно выбрасываете ошибку), она будет обработана родительской границей, если таковая существует.