4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SvelteAdvent Calendar 2024

Day 2

svelte:boundaryについて

Last updated at Posted at 2024-12-01

昨日12月1日にSvelte5.3.0が出されましたがsvelte:boundaryの機能はこの5.3.0 で追加されました。この記事はそのドキュメントを翻訳しました。Bluesky上のSvelteによるとクリスマスまで毎日一つ発表すると言ってます。

image.png

svelte:boundaryは、アプリの一部でのエラーがアプリ全体を壊すことを防ぎ、それらのエラーから回復するために使用します。
<svelte:boundary>のcchildrenのレンダリングまたは更新中、あるいはその中に含まれる $effect 関数の実行中にエラーが発生した場合、そのコンテンツは削除されます。
レンダリングプロセス外で発生するエラー例えばイベントハンドラ内などは、エラーboundaryによって捕捉されません。

プロパティ

バウンダリが機能するためには、failedonerror の少なくとも一方を提供する必要があります。

failed

failed スニペットが提供された場合、throwされたエラーと、コンテンツを再作成する reset 関数と共にレンダリングされます。(デモ)

<svelte:boundary>
	<FlakyComponent />

	{#snippet failed(error, reset)}
		<button onclick={reset}>oops! try again</button>
	{/snippet}
</svelte:boundary>

コンポーネントに渡されるスニペットと同様に、failed スニペットは明示的にプロパティとして渡すこともできます。

<svelte:boundary {failed}>...</svelte:boundary>

または上記のようにboundary内で直接宣言することもできます。

onerror

onerror 関数が提供された場合、同じ error と reset の2つの引数と共に呼び出されます。これは、エラー報告サービスでエラーを追跡する際に役立ちます.

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

またはerrorresetboundaryの外でも使えます。

<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();
	}}>
		oops! try again
	</button>
{/if}

onerror 関数内でエラーが発生した場合(またはエラーを再スローした場合)、親バウンダリが存在する場合はそこで処理されます。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?