Svelte入門:リファレンス $app/navigation -Vol.1-

スポンサーリンク
Svelte入門:リファレンス $app/navigation -Vol.1- 用語解説
Svelte入門:リファレンス $app/navigation -Vol.1-
この記事は約8分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、SvelteKitのリファレンスについて解説しています。

スポンサーリンク

背景

SvelteKitのリファレンスについて調査する機会がありましたので、その時の内容を備忘として記事に残しました。

$app/navigation

import {
	afterNavigate,
	beforeNavigate,
	disableScrollHandling,
	goto,
	invalidate,
	invalidateAll,
	onNavigate,
	preloadCode,
	preloadData,
	pushState,
	replaceState
} from '$app/navigation';

$app/navigation モジュールは SvelteKit アプリケーションでクライアントサイドのナビゲーションを制御するための関数を提供します。主な機能は以下の通りです:

  1. afterNavigate – ナビゲーション完了後に実行されるコールバック関数を設定します。ページ遷移後の処理に使用します。
  2. beforeNavigate – ナビゲーション開始前に実行されるコールバック関数を設定します。ページ遷移前の処理に使用します。
  3. disableScrollHandling – SvelteKit のデフォルトのスクロール処理を無効化します。カスタムのスクロール動作を実装したい場合に使用します。
  4. goto – プログラムによるナビゲーションを実行します。指定されたURLに移動します。
  5. invalidate – 特定のデータの依存関係を無効化し、ページのデータを再読み込みします。
  6. invalidateAll – すべてのデータの依存関係を無効化し、ページ全体のデータを再読み込みします。
  7. onNavigate – ナビゲーション中に実行されるコールバック関数を設定します。
  8. preloadCode – 指定されたページのコードを事前に読み込みます。パフォーマンス向上のために使用します。
  9. preloadData – 指定されたページのデータを事前に読み込みます。パフォーマンス向上のために使用します。
  10. pushState – ブラウザの履歴に新しいエントリを追加します。新しいURLにナビゲーションする際に使用します。
  11. replaceState – 現在のブラウザ履歴エントリを置き換えます。現在のURLを別のURLに置き換える際に使用します。

これらの関数を使用することで、SvelteKit アプリケーション内でのナビゲーション体験をカスタマイズし、よりスムーズで効率的なユーザー体験を提供することができます。

afterNavigate

コンポーネントがマウントされたとき、およびURLへのナビゲーションが発生するたびに、指定された callback を実行するライフサイクル関数です。 afterNavigate はコンポーネントの初期化中に呼び出す必要があります。コンポーネントがマウントされている限り、この関数はアクティブな状態を維持します。

function afterNavigate(
	callback: (
		navigation: import('@sveltejs/kit').AfterNavigate
	) => void
): void;

解説

afterNavigate は SvelteKit のナビゲーション機能の一つで、以下のような特徴があります:

  1. ライフサイクル関数 – コンポーネントのライフサイクルに密接に関連しており、コンポーネントの初期化時に設定する必要があります。
  2. タイミング – この関数は以下の2つのタイミングで実行されます:
    • コンポーネントが最初にマウントされたとき
    • アプリケーション内で新しいURLにナビゲーションしたとき
  3. コールバック関数afterNavigate に渡すコールバック関数は、navigation オブジェクト(@sveltejs/kitAfterNavigate 型)を引数として受け取ります。このオブジェクトにはナビゲーションに関する情報が含まれています。
  4. 持続性 – 一度設定すると、コンポーネントがアンマウントされるまでアクティブな状態を保ちます。

使用例

<script>
  import { afterNavigate } from '$app/navigation';
  
  let currentPath;
  
  afterNavigate((navigation) => {
    // ナビゲーション後の処理
    currentPath = navigation.to?.url.pathname;
    console.log('現在のパス:', currentPath);
    
    // ページ遷移後にスクロール位置を調整するなどの処理も可能
    if (navigation.to?.url.hash) {
      const element = document.getElementById(navigation.to.url.hash.substring(1));
      if (element) element.scrollIntoView();
    }
  });
</script>

このような形で、ページナビゲーション後の様々な処理を実装することができます。例えば、アナリティクス計測の実装やページ遷移後のUI調整などに活用できます。

beforeNavigate

リンクのクリック、goto(...) の呼び出し、またはブラウザの戻る/進むボタンの使用によってURLへのナビゲーションが発生する前に起動するナビゲーション・インターセプターです。 cancel() を呼び出すと、ナビゲーションの完了を防ぐことができます。navigation.type === 'leave' の場合(ユーザーがアプリから離れる、またはタブを閉じる場合)、cancel を呼び出すとブラウザのネイティブなアンロード確認ダイアログがトリガーされます。この場合、ユーザーの応答によってナビゲーションがキャンセルされるかどうかが決まります。 ナビゲーション先が SvelteKit が所有するルート(SvelteKit のクライアントサイドルーターによって制御される)でない場合、navigation.to.route.idnull になります。 ナビゲーションが(キャンセルされなければ)ドキュメントのアンロードを引き起こす場合、つまり 'leave' ナビゲーションや navigation.to.route === null となる 'link' ナビゲーションの場合、navigation.willUnloadtrue になります。 beforeNavigate はコンポーネントの初期化中に呼び出す必要があります。コンポーネントがマウントされている限り、この関数はアクティブな状態を維持します。

function beforeNavigate(
	callback: (
		navigation: import('@sveltejs/kit').BeforeNavigate
	) => void
): void;

解説

beforeNavigate は SvelteKit のナビゲーション機能で、以下のような特徴があります:

  1. ナビゲーション・インターセプター – ナビゲーションが発生する前に処理を挟むことができます。
  2. キャンセル機能 – コールバック内で cancel() を呼び出すことで、ナビゲーションをキャンセルできます。
  3. ナビゲーションタイプ – 以下のようなナビゲーションタイプを区別できます:
    • 'leave' – アプリから離れる(タブを閉じるなど)
    • 'link' – リンクによるナビゲーション
    • その他(goto や履歴ナビゲーションなど)
  4. アンロード判定navigation.willUnload プロパティを通じて、ナビゲーションがドキュメントのアンロードを引き起こすかどうかを判断できます。
  5. ルート判定navigation.to.route.idnull かどうかで、SvelteKit が制御するルートへのナビゲーションかどうかを判断できます。

使用例

<script>
  import { beforeNavigate } from '$app/navigation';
  
  let formChanged = false;
  
  beforeNavigate((navigation) => {
    // フォームが変更されていて、かつユーザーがページから離れようとしている場合
    if (formChanged && navigation.type !== 'popstate') {
      // ナビゲーションをキャンセルし、確認ダイアログを表示
      const confirmed = confirm('変更が保存されていません。本当に移動しますか?');
      if (!confirmed) {
        navigation.cancel();
      }
    }
    
    // 外部サイトへのナビゲーションの前に警告を表示
    if (navigation.to && !navigation.to.route.id) {
      console.log('外部サイトへ移動します');
    }
  });
  
  function updateForm() {
    formChanged = true;
  }
</script>

<form on:change={updateForm}>
  <!-- フォーム要素 -->
</form>

この関数は、未保存のフォームデータがある場合の警告表示や、特定の条件下でのナビゲーション制御など、ユーザー体験を向上させるための様々なシナリオで活用できます。

おわりに

今日は、 SvelteKitのリファレンスについて解説しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました