HTMX入門
Ajax通信
htmxで発行できるHTTPメソッド表
属性 | Description |
---|---|
hx-get | GET リクエスト 発行 |
hx-post | POST リクエスト 発行 |
hx-put | PUT リクエスト 発行 |
hx-patch | PATCH リクエスト 発行 |
hx-delete | DELETE リクエスト 発行 |
HTMLから直接AJAXリクエストを発行することができます。
これらの属性のそれぞれは、AJAX要求を発行するためにURLを使用します。要素は、指定されたもののリクエストを発行します
要素がトリガーされたときに指定されたURLに入力します。
<div hx-put="/put_endpoint"> PUTリクエストを発行するボタン </div>
ユーザーがこのdivをクリックしたら、URL
/put_endpoint
メッセージにPUTリクエストを発行し、このボタン要素に応答をロードします
hx-get
hx-getは指定したエンドポイントにGET
リクエストを送信します。
受け取ったHTMLを子要素に入れ込みます。
GETリクエストはサーバーからのリソースのデータの取得に使用されます。
<div hx-get="/example">何かしらのHTMLがここに書き込まれる</div>
hx-put
hx-putは指定したエンドポイントにPUT
リクエストを送信します。
HTTP PUTリクエストは通常、サーバー上のリソースの更新に使用されます。
<button hx-put="/account" hx-target="body"> Put Money In Your Account </button>
hx-put="/account"
: この属性は、HTMXに対して、ボタンがクリックされたときにHTTP PUTリクエストを/accountエンドポイントに送信するように指示します。hx-target="body"
: この属性は、リクエストのレスポンス(応答)で更新するHTML要素を指定します。bodyが指定されているため、レスポンスの内容でHTML文書全体(<body>
要素)が更新されます。
hx-post
hx-postは指定したエンドポイントに対して POST
リクエストを送信します。
POSTメソッドは通常、要素の作成を意味します。
<div id="response"></div> <button hx-post="/put_page" hx-target="#response"> 投稿ボタン </button>
<div id="response"></div>
: id属性がresponseなので、この要素は他の部分から参照される際に使われます。この要素は後述のボタン操作により、サーバーからの応答データを挿入するためのターゲットです。hx-post="/put_page"
: この属性により、ボタンがクリックされたときに、指定されたURL(この場合は/put_page)にHTTP POSTリクエストが送信されますhx-target="#response"
: POSTリクエストの結果(サーバーからの応答データ)が挿入される要素を指定します。この場合、id="response"を持つ要素(先述の)がターゲットです。hx-patch
hx-patch
は指定したエンドポイントにPATCH
リクエストを送信します。 ATCHリクエストはHTTPメソッドの一つで、リソースの部分的な更新を行うために使用されます<button hx-patch="/page" hx-target="#table"> table page </button>
hx-patch="/page"
: ボタンがクリックされたときに、PATCHリクエストが送信されることを意味します。この場合、/pageというURLに対してPATCHリクエストが送信されます。hx-target="#table"
PATCHリクエストのレスポンスが返ってきたときに、どのHTML要素を更新するかを指定します。
上記は
hx-patch
の一部の機能にすぎませんが、全体のコードは以下のようになります。<!DOCTYPE html> <html> <head> <script src="https://unpkg.com/htmx.org"></script> </head> <body> <button hx-patch="/page" hx-target="#table"> table page </button> <div id="table"> <!-- この部分が更新される --> </div> </body> </html>
hx-delete
hx-delete
は指定したエンドポイントにDeleteメソッドを送信します。 DeleteメソッドはCRUDでの削除を表し、POSTリクエストなどで作成した要素をDELETE
メソッドで削除できます。<button hx-delete="/page" hx-target="#page"> Delete Your Page </button>
このコードの動作をまとめると、ユーザーがボタンをクリックすると、/pageというURLに対してDELETEリクエストが送信され、そのレスポンスがid="page"を持つ要素に適用されます。 これにより、ページ全体をリロードすることなく、指定された部分だけが更新されます。
triggeringリクエスト
デフォルトでは、AJAX通信は各々のhtml要素によって自然に定義されたイベントによってトリガーされます。
input
、textarea
、およびselect
が変更イベントでトリガーされますform
は送信イベント(submit
)でトリガーされます- 他のすべてのhtml要素、クリックイベントによってトリガーされます
別のトリガー動作を指定する必要がある場合は、
hx-trigger
を使用できます。例えば、マウスが入力したときに
/new_action
エンドポイント から投稿するdivは次のとおりです。<div hx-post="/new_action" hx-trigger="mouseenter"> マウスが入りました </div>
上記の例では
hx-trigger
にmouseenter
を指定するすることで、エリアにマウスが入った時にイベントが発生します。イベントの種類は以下の通りです。
click
: 要素がクリックされた時にイベントが発火されますclick[boolean_value]
: 要素がクリックされたときに、boolean_value
をチェックしてTrue
の場合に発火します。 この条件は次のように、グローバル関数を使用することもできますclick[check_boolean_state()]
keyup
: 入力値にキー入力されたときをイベントトリガーとします。submit
: フォームの送信をトリガーとします。change
: 入力値が変更された時をトリガーとします。load
: 要素が読み込まれた時をトリガーとします。
https://www.appleple.com/blog/frontend/htmx202402.html
trigger修飾子
トリガーには、動作を変更するいくつかの追加の修飾子があります。 たとえば、リクエストが必要な場合のみ一度起こると、トリガーには1回の修飾子を使用できます。
<div hx-post="/mouse_entered" hx-trigger="mouseenter once"> [Here Mouse, Mouse!] </div>
トリガーに使用できる他の修飾子は次のとおりです。
changed
- 要素の値が変更された場合にのみリクエストを発行しますdelay:<19>
- 与えられた時間(例:1秒)を待ってくださいリクエストを発行します。イベントが再びトリガーされた場合、カウントダウンはリセットされます。from:<css selector>
- 別の要素で発生するイベントをリッスンします。once
- イベントは最初の一度だけ発生します。
これらの属性を使用して、アクティブ検索など、多くの一般的なUXパターンを実装できます。
複数のトリガーを
hx-trigger
属性で指定し、コンマで区切ることができます。<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>hx-trigger Example</title> <script src="https://unpkg.com/htmx.org@1.6.1"></script> </head> <body> <button hx-trigger="click, mouseover" hx-get="/some-endpoint">Click or Hover Me</button> </body> </html>
この例では、button 要素は
click
イベントおよびmouseover
イベントのどちらかが発生したときにトリガーされます。リクエストのオプション
ポーリングで定期的にリクエストをする
ボタンクリックなどのイベントを待つのではなく、特定のURLに要素に定期的にリクエストする場合は、
every
を使用してポーリングすることができます。<div hx-get="/news" hx-trigger="every 2s"></div>
このhtmlは次の内容を表します。
2秒ごとに、getメソッドで
/news
を発行し、応答をdivにロードしますサーバーの応答からポーリングを停止したい場合は、サーバーからのHTTP応答コード286で停止できます。
遅延リクエスト
HTMXでの投票を達成するために使用できるもう1つの手法は、「負荷投票」です。 遅延とともに負荷トリガー、そしてそれ自体を応答に置き換えます。
<div hx-get="/messages" hx-trigger="load delay:1s" hx-swap="outerHTML" > </div>
/messages
のエンドポイントからの応答は1秒待って反映されます。requestインジケーターでスピナーを表示する
AJAXリクエストが発行された後、サーバー側に何かが起こっていることをユーザーに知らせることはしばしば良いことです。 html-indicatorクラスを使用して、HTMXでこれを達成できます。
HTMX-Indicatorクラスは
html
でクラスとして定義されているため、このクラスのあらゆる要素の不透明度がデフォルトで0になり、domは存在しますが、見えないようになります。HTMXがリクエストを発行すると、HTMXは自動的にhtmx-requestクラスを自動的に要素に配置します。 HTMX-Requestクラスは、HTMX-Indicatorクラスでチャイルドエレメントの不透明度を1に移行し、インジケータを表示します。
<button hx-get="/click"> Click Me! <img class="htmx-indicator" src="/spinner.gif"> <!-- ボタンがクリックされると、htmx-requestクラスがclassに追加されて透明度が1になる--> </button>
ここにボタンがあります。クリックすると、htmx-requestクラスが追加され、スピナーが表示されます。
HTMX-Indicatorクラスは不透明度を使用して進行状況インジケーターを非表示にして表示しますが、別のメカニズムを好む場合は 次のように、独自のCSSトランジションを作成できます。
.htmx-indicator{ display:none; } .htmx-request .htmx-indicator{ display:inline; } .htmx-request.htmx-indicator{ display:inline; }
htmx-requestクラスを子要素ではない別の要素に追加したい場合は、hx-indicatorを使用できます。
<div> <button hx-get="/click" hx-indicator="#indicator"> Click Me! </button> <img id="indicator" class="htmx-indicator" src="/spinner.gif"/> </div>
ここでは、IDによって明示的にインジケーターを呼び出します。ただし、親要素のdivにも同じクラスを配置できたであろうことに注意してください
targets
CSSセレクターをhx-target属性に指定することで、リクエストを行った要素以外の応答を別の要素にロードできます。
<input type="text" name="q" hx-get="/trigger_delay" hx-trigger="keyup delay:500ms changed" hx-target="#search-results" placeholder="Search..." > <div id="search-results"></div>
hx-swap
HTMXは、apiからのレスポンスHTMLを別のDOMに入れ込むいくつかの異なる方法を提供します。 デフォルトでは、コンテンツはターゲット要素のinnerhtmlに置き換えられます。
hx-swap
属性を使用して置き換え対象を変更できますName Description innerHTML
デフォルトでは、コンテンツをターゲット要素内に置きます outerHTML
ターゲット要素全体を返されたコンテンツで置き換えます afterbegin
ターゲット内の最初の子の前にコンテンツを追加します beforebegin
ターゲットの親要素内のターゲットの前にコンテンツを追加します beforeend
ターゲット内の最後の子の後にコンテンツを追加します afterend
ターゲットの親要素のターゲットの後にコンテンツを追加します delete
応答に関係なくターゲット要素を削除します swapオプション
hx-swap
属性は、HTMXのスワッピング動作を調整するための多くのオプションをサポートしています。 例えば、デフォルトではHTMXは新しいコンテンツのどこにでもあるタイトルタグのタイトルを入れ替えます。<button hx-post="/like" hx-swap="outerHTML ignoreTitle:true">Like</button>
/like
からの応答HTMLの中にtitle
タグが存在する場合、HTMLのタイトルが入れ替わってしまいます。 ignoreTitle Modifierをtrueに設定することにより、HTMLにあるタイトルタグが入れ替わってしまうことを防げます。そのほかのHX-SWAPで利用可能な修飾子は次のとおりです。
Option Description transition
true
またはfalse
を設定することで、このスワップに view transition API を使用するかどうかを設定できます。swap
古いコンテンツがクリアされてから新しいコンテンツが挿入されるまでに使用するスワップ遅延秒数 (例: 100ms
)settle
新しいコンテンツが挿入されてから確定するまでの間に使用する確定遅延 (例: 100ms
)ignoreTitle
「true」に設定すると、新しいコンテンツ内で見つかったタイトルは無視され、ドキュメントのタイトルは更新されません。 すべてのスワップ修飾子は、スワップスタイルの後で指定し、コロンで複数修飾できます。
page:https://minegishirei.hatenablog.com/entry/2024/05/16/195121