コンテンツにスキップ

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. ステップ・バイ・ステップ解説

  1. ターゲットの整理: メインで変えたい場所(hx-target)と、ついでに変えたい場所(OOB)のIDを整理します。
  2. 属性の指定: hx-select でメインを、hx-select-oob で「ついで」に抜き出したいセレクタを指定します。
  3. 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)を詳しくご紹介します。