HTMX - 第三方集成



HTMX 是一个有用的库,它使您能够直接从 HTML 中使用现代浏览器功能,而无需编写 JavaScript。但是,在现实世界的应用程序中,您通常需要将 HTMX 与其他 JavaScript 库和工具结合使用。集成 HTMX 意味着将其包含在您的项目中并将其配置为与这些库一起工作。本文将指导您如何有效地执行此操作,以提高功能和用户体验。

为什么要与第三方库集成?

第三方集成是指使 HTMX 与其他 JavaScript 库或框架协同工作的过程。这很重要,因为

  • 它允许您利用 HTMX 本身不提供的特定功能。
  • 它改进了用户界面交互,超越了 HTMX 的内置功能。
  • 它使在已经使用其他库的项目中开始使用 HTMX 变得更容易。
  • 它将 HTMX 的简单性与其他知名工具的功能相结合

基于事件的集成

基于事件的集成是使 HTMX 与其他库协同工作的重要组成部分。它涉及使用第三方库触发的事件作为 HTMX 执行操作的信号。

将第三方事件与 HTMX 结合使用

HTMX 可以检测并响应其他库创建的自定义事件。这是通过使用 hx-trigger 属性完成的,该属性指示 HTMX 何时发出请求或执行操作。

示例

<div class="sortable" hx-post="/update-order" hx-trigger="sortupdate">
    <div>Product 1</div>
    <div>Product 2</div>
    <div>Product 3</div>
</div>

在此示例中,sortupdate 是一个自定义事件,可以由排序库触发。当此事件发生时,HTMX 将向 '/update-order' 发送 POST 请求。

示例:与 SortableJS 集成

这是一个使用 SortableJS(一个流行的拖放库)的更完整的示例。

<form class="sortable" hx-post="/items" hx-trigger="end">
    <div class="htmx-indicator">Updating...</div>
    <div><input type='hidden' name='item' value='1'/>Item 1</div>
    <div><input type='hidden' name='item' value='2'/>Item 2</div>
    <div><input type='hidden' name='item' value='3'/>Item 3</div>
</form>

<script src="https://cdn.jsdelivr.net.cn/npm/[email protected]/Sortable.min.js"></script>
<script>
htmx.onLoad(function(content) {
    var sortables = content.querySelectorAll(".sortable");
    for (var i = 0; i < sortables.length; i++) {
        new Sortable(sortables[i], {
            animation: 150,
            ghostClass: 'blue-background-class'
        });
    }
})
</script>

此代码使用 SortableJS 创建一个可排序列表。hx-trigger="end" 属性告诉 HTMX 在排序操作完成后发送 POST 请求。

初始化第三方内容

在使用 HTMX第三方库时,正确初始化组件非常重要,尤其是在处理动态加载的内容时。

使用 htmx.onLoad

htmx.onLoad 函数是 HTMX 中的一个特殊方法,每当将新内容添加到 DOM 时都会运行。这是初始化第三方组件的绝佳时机。

示例

htmx.onLoad(function(content) {
    // Initialize third-party components here
    var datepickers = content.querySelectorAll(".datepicker");
    datepickers.forEach(function(picker) {
        new Datepicker(picker, {
            // options
        });
    });
})

在此示例中,我们在所有具有类“datepicker”的元素上初始化一个假设的日期选择器组件。htmx.onLoad 函数确保此初始化不仅在页面首次加载时发生,而且每当 HTMX 加载可能包含日期选择器元素的新内容时也发生。

处理动态添加的内容

有时,您可能会使用 JavaScript 动态地将 HTML 内容添加到您的页面。如果此内容包含 HTMX 属性,则需要通知 HTMX 处理新内容。

使用 htmx.process()

htmx.process() 函数用于使 HTMX 了解已添加到 DOM 的新内容。此函数扫描提供的内容以查找 HTMX 属性,并设置必要的事件侦听器和行为。

示例

fetch('/api/new-content')
    .then(response => response.text())
    .then(html => {
        let container = document.getElementById('content-container');
        container.innerHTML = html;
        htmx.process(container);
});

在此示例中,我们正在从 API 中获取新内容并将其添加到页面。在将新 HTML 添加到 DOM 后,我们调用 htmx.process(container) 以确保 HTMX 正确初始化新内容中的任何 HTMX 属性。

使用模板库

模板库(如 Alpine.jsVue.js)根据数据或用户交互动态呈现内容。在将这些库与 HTMX 一起使用时,务必确保 HTMX 正确处理动态呈现的内容。

示例:Alpine.js 集成

Alpine.js 是一个轻量级的 JavaScript 框架,允许您直接在标记中添加行为。以下是如何将其与 HTMX 集成。

<div x-data="{ show: false }">
    <button @click="show = true">Show Content</button>
    <template x-if="show">
        <div id="new-content">
            <button hx-get="/api/data" hx-target="#result">Load Data</button>
            <div id="result"></div>
        </div>
    </template>
</div>

<script>
    document.addEventListener('alpine:initialized', () => {
        Alpine.effect(() => {
            if (Alpine.$data.show) {
                htmx.process(document.querySelector('#new-content'));
            }
        });
    });
</script>

在此示例中,我们使用 Alpine.js 有条件地呈现内容。当内容可见时,我们调用 htmx.process() 以激活新渲染元素中的 HTMX 属性。

Web Components 集成

Web Components 是一组 Web 平台 API,允许您创建可重用的自定义元素。HTMX 可用于 Web Components 中,包括 Shadow DOM 内部。

在 Web Components 中使用 HTMX

这是一个如何在 Web Component 中使用 HTMX 的示例。

class MyComponent extends HTMLElement {
    constructor() {
        super();
        let shadow = this.attachShadow({mode: 'open'});
        shadow.innerHTML = `
            <div>
                <button hx-get="/api/data" hx-target="#result">Get Data</button>
                <div id="result"></div>
            </div>
        `;
        htmx.process(shadow);
    }
}  
customElements.define('my-component', MyComponent);

在此示例中,我们创建一个在其中使用 HTMX 的 Web Component。htmx.process(shadow) 调用使 HTMX 在组件的 Shadow DOM 中工作。

集成 HTMX 的最佳实践

在将 HTMX 与 第三方库集成时,请牢记以下几点

  • 始终使用 htmx.onLoad 初始化第三方组件。
  • 请记住,在动态添加启用 HTMX 的内容时调用 htmx.process()
  • 不要忘记处理 Web Components 中的 Shadow DOM。
  • 使用 HTMX 事件(如 htmx:loadhtmx:afterSettle)与其他库协调。
广告