SHOEISHA iD

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

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

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

「Svelte」でWebページの内容を動的に更新する、リアクティブ機能とバインディング機能の活用方法

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

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

Svelteのバインディング機能(1)

 これまで説明してきたサンプルは、変数の更新を画面に反映するといった一方向の処理でしたが、逆に画面の更新を変数に反映する、いわゆるバインディングの処理もSvelteで利用できます(AngularやVue.jsのバインディング機能に相当します)。さまざまな入力部品でバインディングを実装した、図5のサンプルで説明します。

図5 バインディングのサンプル(p003-bindings)
図5:バインディングのサンプル(p003-bindings)

 図5を表示するWebページ全体のコンポーネントはリスト3の通りです。バインディングの種類ごとに実装したコンポーネントを参照しています。

[リスト3]図5を表示するWebページ全体のコンポーネント(p003-bindings/src/routes/+page.svelte)
<script lang="ts">
  // コンポーネントのインポート
  import TextBox from "./TextBox.svelte";
(略)
</script>

<!-- コンポーネントの表示 -->
<h3>テキストボックス</h3>
<TextBox />
(以下略)

テキストボックスとテキストエリア

 まず、もっとも基本的なバインディングの記述を、テキストボックスを利用した図6の例で紹介します。

図6:テキストボックスのバインディング(p003-bindings)
図6:テキストボックスのバインディング(p003-bindings)

 図6の実装はリスト4の通りです。(2)でテキストボックスの<input>タグにbind:value={value}と属性を指定して、テキストボックスと(1)のvalue変数を紐づけます。

[リスト4]テキストボックスのバインディング実装(p003-bindings/src/routes/TextBox.svelte)
<script lang="ts">
  let value: string = 'Google Pixel 9'; // ...(1)
</script>

<input bind:value={value}> <!--(2)-->
<div>→入力値: {value}</div>

 図7の通り、複数行入力可能なテキストエリアも利用できます。

図7:テキストエリアのバインディング(p003-bindings)
図7:テキストエリアのバインディング(p003-bindings)

 図7の実装はリスト5の通りです(<script>部は省略)。<input>タグのかわりに<textarea>タグを利用する以外、テキストボックスと同様の実装内容となります。

[リスト5]テキストエリアのバインディング実装(p003-bindings/src/routes/TextArea.svelte)
<textarea bind:value={value}></textarea>
<div>→入力値:<pre>{value}</pre></div>

 以降の例でも、基本的にbind:~という属性を入力部品のタグに指定して、バインディングを実現します。

[補足]バインディング記述の省略形

 バインディングの指定に利用する記述(ここではbind:value)と変数名(ここではvalue)が一致する場合、変数名の記述を省略できます。例えばリスト4のbind:value={value}記述は、リスト6の通りbind:valueと省略して記述できます。

[リスト6]バインディング記述の省略形(p003-bindings/src/routes/ShorthandTextBox.svelte)
<input bind:value><!-- 省略形 -->

チェックボックス

 チェックボックスの例を図8に示します。チェックボックスのチェック有無に対応して、trueまたはfalseが画面に表示されます。

図8:チェックボックスのバインディング(p003-bindings)
図8:チェックボックスのバインディング(p003-bindings)

 図8の実装はリスト7の通りです。(2)でチェックボックスの<input>タグにbind:checked={bool}と属性を指定して、チェックボックスを(1)のbool変数と紐づけます。

[リスト7]チェックボックスのバインディング実装(p003-bindings/src/routes/CheckBox.svelte)
<script lang="ts">
  let bool: boolean = true; // ...(1)
</script>

<input type="checkbox" bind:checked={bool}> <!--(2)-->
→入力値: {bool}

ラジオボタンと複数チェックボックス

 複数の選択肢から1つを選択するラジオボタンの例を図9に示します。選択された選択肢の値が画面に表示されます。

図9:ラジオボタンのバインディング(p003-bindings)
図9:ラジオボタンのバインディング(p003-bindings)

 図9の実装はリスト8の通りです。各ラジオボタンの<input>タグにbind:group={value}と属性を指定して、各ラジオボタンをvalue変数と紐づけることで、選択された選択肢の値がvalue変数に反映されます。

[リスト8]ラジオボタンのバインディング実装(p003-bindings/src/routes/RadioButton.svelte)
<script lang="ts">
  let value: string = 'pixel9';
</script>

<label>
  <input type="radio" bind:group={value}
   value="pixel9">Google Pixel 9
</label>
<label>
  <input type="radio" bind:group={value}
   value="galaxyzfold5">Samsung Galaxy Z Fold5
</label>
<label>
  <input type="radio" bind:group={value}
   value="edge50pro">motorola edge 50 pro
</label>
<div>→選択値: {value}</div>

 複数選択できるチェックボックスのリストも類似の方法で実装できます。図10のサンプルで説明します。

図10:複数チェックボックスのバインディング(p003-bindings)
図10:複数チェックボックスのバインディング(p003-bindings)

 図10の実装はリスト9の通りです。各チェックボックスの<input>タグにbind:group={arr}と属性を指定します。複数選択できるため、紐づける変数arrは配列にします。なお(1)は、arr配列のjoinメソッドを利用して、配列の各要素をカンマ(, )でつなげて1つの文字列にする記述です。

[リスト9]複数チェックボックスのバインディング実装(p003-bindings/src/routes/MultiCheckBox.svelte)
<script lang="ts">
  let arr: Array<string> = [];
</script>

<label>
  <input type="checkbox" bind:group={arr}
   value="pixel9">Google Pixel 9
</label>
<label>
  <input type="checkbox" bind:group={arr}
   value="galaxyzfold5">Samsung Galaxy Z Fold5
</label>
<label>
  <input type="checkbox" bind:group={arr}
   value="edge50pro">motorola edge 50 pro
</label>
<div>→選択値: {arr.join(', ')}</div> <!--(1)-->

次のページ
Svelteのバインディング機能(2)

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

  • 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/20381 2024/11/05 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング