コンテンツにスキップ

077. hx-select(一部分のみの抜粋:大きな返信から「宝物」だけを取り出す)

原理:情報の「つまみ食い」

サーバーが「全部入り」を返してきても大丈夫

HTMXの理想は、サーバーが「その場に必要な小さなHTMLパーツ」だけを返してくれることです。しかし、現実はそう甘くありません。 - サーバーのプログラムを書き換える権限がない。 - 既存の「全画面が表示されるURL」をそのまま使い回したい。 - サーバーが気を利かせすぎて、余計なヘッダーやメニューまで一緒に送ってくる。

こんな時、HTMXの hx-select 属性は、届いた巨大なHTMLの中から「本当に欲しかった一部分だけをハサミで切り取る」ように抜き出してくれます。


実践:既存のページを「パーツ」として再利用する

1. 普通のページから「メイン記事」だけを抜き出す

サイドバーや広告、メニューが並ぶ通常のブログ記事のURL(/blog/123)から、本文の入った article タグだけを抜き出して表示する例です。

<!-- 
  hx-get: 普通のページをリクエスト
  hx-select: 返ってきたHTMLの中から <article id="main-content"> だけを探して抜き出す
  hx-target: 画面の中央エリアに表示する
-->
<button hx-get="/blog/123" 
        hx-select="#main-content" 
        hx-target="#display-area">
    記事の本文だけを見る
</button>

<div id="display-area">
    ここに本文だけが届きます(サイドバーなどは捨てられます)。
</div>

2. IDやCSSセレクタで指定

hx-select には、CSSと同じように #id.class、あるいは article のようなタグ名を書くことができます。HTMXは届いたHTMLの壁紙の中から、その条件に一致するものを探し出し、それ以外を潔く捨て去ります。

3. ステップ・バイ・ステップ解説

  1. 相手の状態を確認: サーバーが返すHTMLの構造を見て、「どこの部分を抜き出したいか」のセレクタを特定します。
  2. 属性の記述: hx-select="#target-id" のように書き込みます。
  3. 効率の考慮: ブラウザ側で切り取っているだけで、通信自体は「全部」届いています。可能であればサーバー側で絞り込むのがベストですが、できない時の強力な救済策になります。

比較:そのままSwap vs hx-select

そのままSwap(デフォルト)

  • 動作: サーバーから届いた 100KB のHTMLをそのまま全部 hx-target に入れようとする。
  • 結果: 画面が崩れたり、メニューが二重に表示されたりする。

hx-select 使用時

  • 動作: 100KB 届いても、その中の大事な 1KB だけを抽出して hx-target に入れる。
  • 結果: 必要な場所だけが完璧に更新される。

まとめ:初心者のための「再利用」の知恵

hx-select は、あなたの周りにある既存のページや、融通の利かない古いシステムを「HTMX用の部品」に変えてしまう、魔法のハサミです。

  • 開発のスピードアップ: 新しく「パーツ専用のURL」を作る手間を省き、まずは既存のページからパーツを切り出すところから始められます。
  • サーバーは変えない、フロントで変える: インフラ側の変更が難しい現場において、これほど頼もしい機能はありません。
  • 情報のダイエット: ユーザーに見せたくないメタ情報や、二重に読み込まれるスクリプトタグなどを、このハサミで事前に排除することができます。

巨大な情報の中から、真実(必要なパーツ)だけを。hx-select を使って、どんなレスポンスが来ても動じない、賢くて柔軟なフロントエンドを構築してください。次の記事では、さらに高度な「複数箇所の切り出し」を行う「hx-select-oob」(078. hx-select-oob)をご紹介します。