SHOEISHA iD

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

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

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

追加パッケージなしで利用可能! ページ全体の状態を統一的に管理できる「Svelte」のストア機能を紹介

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

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

ストアのバインディング

 コンポーネント内の変数と同様に、ストアについても、コンポーネント内の入力部品と紐づけるバインディング機能を利用できます。この機能を図4のサンプルで説明します。

 このサンプルはストアの内容を表示するPhoneDisplayコンポーネントと、ストアの値を変更するPhoneInputコンポーネントから構成されており、PhoneInputコンポーネントでスマートフォンのブランドと機種を変更すると、変更内容がPhoneDisplayコンポーネントに反映されます。

図4:ストアのバインディング機能を利用するサンプル(p004-binding)
図4:ストアのバインディング機能を利用するサンプル(p004-binding)

 このサンプルで利用するストアはリスト9の通りです。スマートフォンのブランド(brand)と機種(name)に対応する書き込み可能なストアを定義しています。

[リスト9]図4のサンプルで利用するストア(p004-binding/src/lib/store.ts)
export const brand = writable('Apple');
export const name = writable('iPhone 16');

 リスト9のストアを参照して画面に表示するPhoneDisplayコンポーネントの記述はリスト10の通りです。brand、nameストアの内容を表示します。

[リスト10]リスト9のストアを参照するコンポーネント(p004-binding/src/routes/PhoneDisplay.svelte)
<script lang="ts">
  import { brand, name } from '$lib/store';
</script>

<div class="container">
  PhoneDisplayコンポーネント
  <div>メーカー:{$brand}</div>
  <div>機種名: {$name}</div>
</div>

 一方、リスト9のストアを変更するPhoneInputコンポーネントの記述はリスト11の通りです。

[リスト11]バインディング機能でリスト9のストアを変更するコンポーネント(p004-binding/src/routes/PhoneInput.svelte)
<script lang="ts">
  import { brand, name } from '$lib/store'; // ...(1)
  // brandとnameをリセットする処理 ...(2)
  const resetToApple = () => {
    $brand = 'Apple';
    $name = 'iPhone 16';
  };
</script>

<div class="container">
  PhoneInputコンポーネント
  <div>
    <!-- $brandにバインディング ...(3)-->
    <select bind:value={$brand}>
      <option value="Apple">Apple</option>
      <option value="Google">Google</option>
      <option value="motorola">motorola</option>
      <option value="Xiaomi">Xiaomi</option>
    </select>
    <!-- $nameにバインディング ...(4)-->
    <input type="text" bind:value={$name} />
  </div>
  <!-- resetToAppleメソッドを実行するボタン ...(5)-->
  <button on:click={resetToApple}>Apple iPhone 16にリセット</button>
</div>

 <script>部の(1)でbrand、nameストアをインポートしています。(2)は後述するボタンクリック時に、ストアの内容をリセットする処理です。

 一方、表示内容の定義では、(3)の<select>要素と(4)の<input>要素に「bind:value」属性を記述することで、brandストアと<select>要素、nameストアと<input>要素を、それぞれバインディングしています。この記述により、セレクトボックスやテキストボックスを変更すると、変更された内容がストアに反映されます。(5)では、(2)のリセット処理を実行するボタンを定義しています。

 ストアの自動サブスクライブ同様、「$brand」「$name」と$をつけて記述することにより、ストアを普通の変数のように扱って、バインディングや代入が行えます。

まとめ

 本記事では、Webページ全体の状態を統一的に管理できる、Svelteのストア機能を説明しました。Svelteの標準機能として組み込まれているため、ライブラリのインストールやプロジェクト設定の変更なしで、すぐに使い始めることができます。ストア名に「$」を付与することで、サブスクライブ関連の処理を隠蔽できるため、開発者はシンプルにストアのデータ内容に集中して実装が行えます。

 本連載では、Svelteの利用法を、順を追って紹介してきました。SvelteにはSvelteKitを含め、本連載で紹介した以外にさまざまな機能が備わっています。本連載を通してSvelteに興味を持った方は、公式ページで提供されているSvelteSvelteKitのチュートリアルで、Svelteをより深く体験してみてはいかがでしょうか。

参考資料

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

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

もっと読む

この記事の著者

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

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング