1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

HTMXは、HTML属性を使用して動的なWebアプリケーションを構築できる軽量なJavaScriptライブラリです。従来のJavaScriptコードを最小限に抑え、HTMLの属性だけでサーバーとの非同期通信を実現できます。この記事では、HTMXを使ってインライン編集機能を実装する「Click to Edit」パターンを紹介します。

HTMXとは

HTMXは、HTML-driven APPROACHを採用したライブラリで、以下の特徴があります:

  • HTML属性を使用して非同期リクエストを行う
  • ページの一部を動的に更新できる
  • 従来のJavaScriptによる非同期処理よりも簡潔で直感的な記述が可能

Click to Editパターンの概要

Click to Editパターンは、ページのリロードなしにレコードの一部または全体をインラインで編集する方法を提供します。このパターンの主な利点は:

  1. ユーザーエクスペリエンスの向上
  2. サーバーリソースの効率的な利用
  3. シンプルな実装

実装手順

1. HTMXのセットアップ

まず、HTMLファイルにHTMXライブラリを追加します:

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Click to Edit Example</title>
  <script src="https://unpkg.com/htmx.org@1.9.10"></script>
</head>
<body>
  <!-- コンテンツをここに配置 -->
</body>
</html>

2. 初期状態のHTML

ユーザーの詳細を表示する初期状態のHTMLを実装します:

<div id="contact-info" hx-target="this" hx-swap="outerHTML">
    <h2>連絡先詳細</h2>
    <div><label>名前:</label> 山田 太郎</div>
    <div><label>メールアドレス:</label> yamada@example.com</div>
    <div><label>電話番号:</label> 090-1234-5678</div>
    <button hx-get="/contact/1/edit" class="btn primary">
        編集
    </button>
</div>

3. 編集フォームのHTML

編集ボタンをクリックしたときに表示される編集フォームを実装します:

<form id="edit-form" hx-put="/contact/1" hx-target="#contact-info" hx-swap="outerHTML">
  <h2>連絡先編集</h2>
  <div class="form-group">
    <label for="name">名前:</label>
    <input type="text" id="name" name="name" value="山田 太郎" required>
  </div>
  <div class="form-group">
    <label for="email">メールアドレス:</label>
    <input type="email" id="email" name="email" value="yamada@example.com" required>
  </div>
  <div class="form-group">
    <label for="phone">電話番号:</label>
    <input type="tel" id="phone" name="phone" value="090-1234-5678" required>
  </div>
  <button type="submit" class="btn primary">保存</button>
  <button type="button" hx-get="/contact/1" class="btn secondary">キャンセル</button>
</form>

HTMXの主要な属性の説明

  • hx-target: リクエスト結果を挿入する対象要素を指定
  • hx-swap: リクエスト結果をどのように挿入するかを指定(例:outerHTMLは要素全体を置き換え)
  • hx-get: GETリクエストを送信するURL
  • hx-put: PUTリクエストを送信するURL

サーバーサイドの実装

サーバーサイドでは、以下のエンドポイントを実装する必要があります:

  1. /contact/1: 連絡先詳細を返す
  2. /contact/1/edit: 編集フォームを返す
  3. /contact/1 (PUT): 更新されたデータを処理し、新しい詳細を返す

例えば、Express.jsを使用した簡単な実装は以下のようになります:

const express = require('express');
const app = express();

app.use(express.urlencoded({ extended: true }));

let contact = {
  name: '山田 太郎',
  email: 'yamada@example.com',
  phone: '090-1234-5678'
};

app.get('/contact/1', (req, res) => {
  res.send(/* 連絡先詳細のHTML */);
});

app.get('/contact/1/edit', (req, res) => {
  res.send(/* 編集フォームのHTML */);
});

app.put('/contact/1', (req, res) => {
  contact = { ...contact, ...req.body };
  res.send(/* 更新された連絡先詳細のHTML */);
});

app.listen(3000, () => console.log('Server running on port 3000'));

パフォーマンスと互換性

HTMXを使用することで、以下のメリットがあります:

  1. 軽量: HTMXは約14KB(min+gzip)と非常に軽量です。
  2. 高速: 必要な部分のみを更新するため、ページの読み込みが高速です。
  3. SEO対応: サーバーサイドレンダリングを維持しつつ、動的な機能を追加できます。

ブラウザの互換性については、HTMXはIE11を含む主要なモダンブラウザをサポートしています。

ベストプラクティスとTips

  1. プログレッシブエンハンスメント: JavaScriptが無効な環境でも基本機能が動作するよう設計する。
  2. エラーハンドリング: サーバーエラーやネットワークエラーに対応するhx-error属性を使用する。
  3. インジケータの使用: 長時間かかる処理にはhx-indicator属性でローディング表示を追加する。
  4. CSRFトークンの使用: セキュリティ向上のため、hx-headers属性でCSRFトークンを送信する。

発展的な使用例

  1. リアルタイム更新: WebSocketsと組み合わせて、複数ユーザー間でのリアルタイム更新を実現。
  2. 無限スクロール: hx-trigger属性を使用して、スクロールに応じたコンテンツの動的読み込み。
  3. フォームバリデーション: サーバーサイドバリデーションとHTMXを組み合わせた即時フィードバック。

まとめ

HTMXを使用したClick to Editパターンは、シンプルながら強力なインライン編集機能を実現します。従来のJavaScriptフレームワークと比較して、学習コストが低く、既存のHTMLベースのアプリケーションに容易に統合できます。

HTMXを使ったインライン編集機能

参考文献

  1. HTMX公式ドキュメント
  2. HTMXのGitHubリポジトリ
  3. Intercooler.js(HTMXの前身)のパターン集
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?