026. hx-select-oob(範囲外コンテンツの同時つまみ食い)
原理:「最高のパーツ」をあちこちから集める選別術
OOBとセレクトの強力なコンボ
前回の記事で紹介した hx-select(つまみ食い)と hx-swap-oob(範囲外更新)を覚えていますか?
これら二つの性質を併せ持った、より高度でテクニカルな属性が hx-select-oob です。
通常、hx-select は「メインのターゲット(hx-target)」に流し込むためのパーツを選ぶものでした。
しかし、hx-select-oob を使うと、サーバーから届いた大きなHTMLの中から、「メインではない別の場所を更新するためのパーツ」までも、同時につまみ食いして配送することができます。
サーバーが「ページ全体のHTML」しか返してくれない頑固な仕様であっても、ブラウザ側(HTMX)だけで「ここからメイン記事を抜き出し、あっちからはサイドバーの最新情報を抜き出して更新する」という、まるでパズルのような精密な複数箇所更新が可能になります。
HTMLをメモリ上で分解する技術
この属性が指定されると、HTMXはサーバーからのレスポンスを受け取った瞬間、以下のステップを高速に実行します。
1. レスポンス全体のHTMLを一旦読み込む。
2. hx-select-oob に指定されたIDやクラスを探し出し、そのパーツをハサミで切り取る。
3. 切り取ったパーツを、画面上の対応するIDの場所へ直接届ける(OOB配送)。
4. 残ったメインのパーツを、当初のターゲット(hx-target)へ届ける。
実践:1回のフルページ読み込みから複数の場所を救い出す
1. ページ遷移なしで記事とサイドバーを同時更新
サーバーが常にページ全体(<body>の中身全部など)を返してくる場合に、メインコンテンツとサイドバーのバッジだけを抜き出して更新する例です。
<!--
hx-get: 詳細ページを読みに行く
hx-select: メインの中身 "#article" を、今の "#main-content" に入れる
hx-select-oob: 返ってきたHTML内にある "#user-stat" も抜き出し、画面上の同じIDを更新する
-->
<button hx-get="/next-page"
hx-select="#article"
hx-target="#main-content"
hx-select-oob="#user-stat">
次の記事へ
</button>
<main id="main-content">
<!-- ここがメインの更新場所 -->
</main>
<div id="user-stat">
<!-- ここが OOB でついでに更新される場所 -->
</div>
2. カンマ区切りによる複数箇所の指定
hx-select-oob には、複数のIDを並べて書くこともできます。
<button hx-get="/refresh"
hx-select="#main"
hx-select-oob="#nav-summary, #footer-info">
一括更新
</button>
3. ステップ・バイ・ステップ解説
- ターゲットの定義: まずは一番大きく変えたい場所(
hx-target)と、そこに入れるパーツ(hx-select)を決めます。 - ついでに更新したい場所: サーバーから返ってくるHTMLを想像し、そこにある別のパーツのIDを
hx-select-oobに書きます。 - セレクタの厳密さ: 指定したIDやクラスが、サーバーから返ってくるHTMLの中に必ず存在していることを確認してください。存在しない場合は、その場所の更新は単にスキップされます。
比較:JSONによる複数更新 vs hx-select-oob
JSON APIの場合
const response = await fetch('/api/data');
const json = await response.json();
// それぞれのHTML文字列を別々に流し込む
document.querySelector('#main').innerHTML = json.mainHtml;
document.querySelector('#nav').innerHTML = json.navHtml;
HTMXの hx-select-oob
サーバーはいつも通り「普通のHTMLページ(または大きなパーツ)」を返すだけです。 フロントエンド側で「どこを抜き出すか」を指定するだけで、サーバーサイドのロジックを一ミリも変更せずに、リッチな複数箇所更新を実現できます。これは既存のシステム(レガシーシステム)を壊さずに進化させる時に、とてつもない威力を発揮します。
まとめ:初心者のための「ハサミ」の使い方
hx-select-oob を使いこなすと、サーバーの「不自由さ」を「自由」に変えることができます。
- 不測の事態に強い: サーバーがこちらの期待通りの「小さなパーツ」を返してくれなくても、自分で切り取れば済むという安心感があります。
- IDを整理する: 抜き出す側と、流し込む側のIDを一致させておくのが成功の秘訣です。
- 効率を考える: 便利ですが、常に大きなHTMLをやりとりすることには変わりありません。非常にトラフィックが多い場所では、サーバー側で最初から必要な分だけ返すようにする方がスマートです。
届いた素材をどう料理するか、その主導権はサーバーではなくあなたにあります。hx-select-oob という精密なハサミを使って、画面を自由自在にデザインしてください。次の記事では、通信を行う際に「おまけの情報」を添えて送るための hx-vals(027. hx-vals)をご紹介します。