SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Webページ用UIフレームワーク「Svelte」の活用

「Svelte」の活用に不可欠──プロジェクト構成とコンポーネント利用法を解説!

Webページ用UIフレームワーク「Svelte」の活用 第2回

  • X ポスト
  • このエントリーをはてなブックマークに追加

コンポーネントからイベントを発生

 子コンポーネントでイベントを発生させて、親コンポーネントでそれを受け取り処理を行うことができます。図7のサンプルは、子コンポーネントで「購入」ボタンが押されたときにイベントが発生し、それを親コンポーネント側で受け取って、イベントに含まれるメーカーと機種をダイアログで表示します。

図7 コンポーネントでイベントを利用するサンプル(p006-event)
図7 コンポーネントでイベントを利用するサンプル(p006-event)

 イベントを発生する子コンポーネントの<script>部をリスト7に示します。

[リスト7]イベントを発生する子コンポーネント(p006-event/src/routes/Android.svelte)
<script lang="ts">
  import { createEventDispatcher } from 'svelte'; // ...(1)
(略)
  const dispatch = createEventDispatcher(); // ...(2)
  // ボタンクリック時の処理 ...(3)
  const buttonClicked = () => {
    dispatch('purchase', { vendor, model }); // イベントを発生
  };
</script>

 (1)でインポートしたcreateEventDispatcher関数を利用して、(2)でdispatch関数を生成し、ボタンクリック時に実行されるbuttonClicked関数(3)内でdispatch関数を実行してイベントを発生させます。dispatch関数の第1引数(purchase)はイベント名、第2引数(vendor、model)はイベント変数です。

 一方、イベントを受け取る親コンポーネントの実装はリスト8となります。

[リスト8]イベントを受け取る親コンポーネント(p006-event/src/routes/+page.svelte)
<script lang="ts">
  import Android from './Android.svelte';

  const handlePurchaseEvent = (event: CustomEvent) => { // ...(1)
    alert(`購入:${event.detail.vendor} / ${event.detail.model}`); // ...(1a)
  }
</script>

<Android vendor="OPPO" model="Reno11 A"
  on:purchase={handlePurchaseEvent}></Android> <!--(2)-->
(以下略)

 子コンポーネントを記述する際、(2)の通りon:purchase属性にイベントハンドラー(handlePurchaseEvent関数)を設定して、purchaseイベントを受け取ります。handlePurchaseEvent関数(1)では、CustomEvent型の変数eventを関数の引数として受け取り、そのdetailプロパティから取得したイベント変数を(1a)でダイアログに表示します。

ルーティングと共有コンポーネント

 SvelteKitプロジェクトでは、複数のURLに対応してページを出しわけるルーティング機能が利用できます。これまで利用してきたsrc/routes/+page.svelteはサブパスを含まないURL(http://localhost:5173/)に対応する一方、src/routes/<サブパス>フォルダーの中に+page.svelteファイルを配置することで、サブパスを含むURL(http://localhost:5173/<サブパス>)に対応するWebページを実装できます。図8のサンプルにおいて、サブパスを含まないURL(「/」パス)ではWindowsパソコンのラインナップを表示します。

図8 ルーティング機能を利用するサンプル(「/」パス)(p007-route)
図8 ルーティング機能を利用するサンプル(「/」パス)(p007-route)

 図8で「Mac」のリンクをクリックすると、「/mac」パスを含むURLに遷移して、Macのラインナップを表示します。また図8、9のいずれにも共通して「この夏の注目パソコン」というヘッダーを表示します。

図9 ルーティング機能を利用するサンプル(「/mac」パス)(p007-route)
図9 ルーティング機能を利用するサンプル(「/mac」パス)(p007-route)

 図8、9のサンプルにおける、srcフォルダー以下のフォルダー構成を図10に示します。「/」パスに対応するsrc/routesフォルダーと「/mac」パスに対応するsrc/routes/macフォルダーのそれぞれに、ページ全体に対応する+page.svelteファイルと、各ページで利用する子コンポーネントのファイル(Windows.svelte、Mac.svelte)を配置します。また、各ページ共通で利用するヘッダーに対応するコンポーネントのファイル(header.svelte)はsrc/libフォルダーに配置します。

図10 図8、9のサンプルを構成するファイル(p007-route)
図10 図8、9のサンプルを構成するファイル(p007-route)

 「/」パスのページ全体に対応するsrc/routes/+page.svelteの実装を、リスト9に示します(src/routes/macサブフォルダーの+page.svelteも基本的な実装内容は同一です)。

[リスト9]図8の親コンポーネント(p007-route/src/routes/+page.svelte)
<script lang="ts">
  // コンポーネントをインポート ...(1)
  import Windows from './Windows.svelte'; // ...(1a)
  import Header from '$lib/header.svelte'; // ...(1b)
</script>

<!-- 各ページ共通のヘッダー ...(2)-->
 <Header></Header>
<!-- ページ見出しとリンク ...(3)-->
<h3>Windows <a href="/mac">Mac</a></h3>
<!-- 子コンポーネント ...(4)-->
<Windows vendor="Microsoft" model="Surface Pro"></Windows>
<Windows vendor="Dell" model="XPS 15インチ"></Windows>
<Windows vendor="富士通" model="FMV LIFEBOOK UH"></Windows>

 (1)で、コンポーネント内で利用する他のコンポーネントをインポートします。同一フォルダーにあるコンポーネントは(1a)の通り「./」で始まる相対パスで参照しますが、src/libフォルダーにあるコンポーネントは(1b)の通り、参照元にかかわらずどこからでも$lib/で始まるパスで参照できます。(1a)でインポートしたコンポーネントは(4)で、(1b)でインポートしたヘッダーのコンポーネントは(2)で、それぞれ利用しています。

 他ページへのリンクは(3)の通り、HTML同様<a href>でリンク先のパスを指定します。ここではMacのページに対応する「/mac」を指定しています。

まとめ

 本記事では、SvelteKitプロジェクトの構成と基本的な利用法、SvelteでWebページの表示を構成するコンポーネントの実装方法を説明しました。次回は、コンポーネント内のデータと表示を同期するリアクティブな処理とデータバインディングについて解説します。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Webページ用UIフレームワーク「Svelte」の活用連載記事一覧
この記事の著者

WINGSプロジェクト  吉川 英一(ヨシカワ エイイチ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/19910 2024/07/31 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング