078. hx-select-oob(複数箇所の抜粋更新:一度の通信で、あちこちの部品を切り出す)
原理:超強力な「複数のハサミ」
一箇所だけでは満足できない
前回の hx-select は、一つのリクエストから一つのパーツを抜き出すものでした。しかし、世の中には「一回の通信で、こっちの記事本文と、あっちのサイドバーの通知数、両方を同時に更新したい」という欲張りな場面があります。
hx-select-oob(セレクト・アウト・オブ・バンド)は、そんな「複数箇所の同時・抜粋更新」を叶えるための高度な属性です。
サーバーから届いた一つの大きなHTMLから、 1. メインタスクとして「ここ」を抜き出す。 2. 別の場所(Out of Band)として「あそこと、あそこ」も抜き出して、それぞれ同じIDを持つ場所へ飛ばす。 という、まるで手品のようなデータの配送を行います。
実践:複雑なダッシュボードを一撃で更新する
1. 記事の更新と通知件数の同期
ブログの保存ボタンを押したとき、記事の内容だけでなく、画面上部の「お知らせ」マークも一度に更新する例です。
<!--
hx-post: 記事を保存
hx-select: 保存後の「記事本文」を表示エリアへ(#article-view)
hx-select-oob: 返信の中から「通知バッジ(#unread-count)」も探して、
画面上の同じIDを持つ場所へ飛ばす
-->
<button hx-post="/save-article"
hx-select="#article-body"
hx-select-oob="#unread-count">
保存する
</button>
<!-- 画面上部の別の場所にある -->
<div id="unread-count">0</div>
<!-- 目の前にある更新場所 -->
<div id="article-view">
ここに保存後の記事が入ります。
</div>
2. 複数のセレクタを指定
#count, #status-bar のように、カンマ区切りで複数のIDを指定すれば、届いたHTMLからそれらすべてを「宝探し」して、画面のあちこちに貼り付けてくれます。
3. ステップ・バイ・ステップ解説
- ターゲットの整理: メインで変えたい場所(
hx-target)と、ついでに変えたい場所(OOB)のIDを整理します。 - 属性の指定:
hx-selectでメインを、hx-select-oobで「ついで」に抜き出したいセレクタを指定します。 - IDの一致: サーバーが返すHTMLの中にあるIDと、ブラウザの画面上にあるIDが一致している必要があります。
比較:hx-select vs hx-select-oob
hx-select
- 役割: 狙った一箇所を綺麗に抜き出す。
- 移動先: 必ず
hx-targetで指定した場所へ届く。
hx-select-oob
- 役割: 狙った「複数の場所」を同時に抜き出す。
- 移動先: それぞれ、自分と同じIDを持つ画面上の要素を勝手に見つけて上書きする。
まとめ:初心者のための「マルチタスク」な通信
hx-select-oob を使いこなすと、あなたのWebアプリは、まるで高価なSPAフレームワークを使っているかのような「全画面の完璧な連動」を実現します。
- サーバーをシンプルに: サーバー側は、わざわざHTMX専用の小さなパーツを何個も作らなくても、既存の「大きなページ」を返すだけでOKです。HTMX側が「自分に必要なところだけ」を勝手に拾って、適切な場所へ配ってくれます。
- ID設計が重要: この機能はIDを頼りに動きます。更新したい主要なパーツには、常に誇りを持ってIDを付けておきましょう。
- 通信の劇的な節約: 「通知のため」「本文のため」「ランキングのため」と個別に何度も通信する必要がなくなります。一回で済むことは一回で済ませる。これがプロの設計です。
一度の通信、無限の可能性。hx-select-oob を使って、画面全体が呼吸を合わせるように連動する、隙のないユーザー体験を作り上げてください。次の記事では、抜粋ではなくサーバーが最初から別口で用意したパーツを飛ばす「hx-swap-oob」(079. hx-swap-oob)を詳しくご紹介します。