模板片段

Carson Gross

模板片段是伺服器端渲染 (SSR) 模板庫中相對罕見的功能,它允許您渲染模板內的片段或部分內容,而不是整個模板。此功能在 超媒體驅動應用程式 中非常方便,因為它允許您在內部分解特定視圖以進行部分更新,而無需將模板片段提取到單獨的檔案進行渲染,從而產生大量單獨的模板檔案。

透過將所有 HTML 保存在單一檔案中,也更容易推論某個功能如何運作。這遵循了 行為局部性 的設計原則。

#動機

讓我們看看模板片段如何在一個稱為 chill 模板 的晦澀 Java 模板語言中,幫助我們建構 HDA。

這是一個簡單的 chill 模板,/contacts/detail.html,用於顯示聯絡人

#/contacts/detail.html
<html>
    <body>
        <div hx-target="this">
          #if contact.archived
          <button hx-patch="/contacts/${contact.id}/unarchive">Unarchive</button>
          #else
          <button hx-delete="/contacts/${contact.id}">Archive</button>
          #end
        </div>
        <h3>Contact</h3>
        <p>${contact.email}</p>
    </body>
</html>

在模板中,我們有一個歸檔功能,根據聯絡人的歸檔狀態,我們顯示「歸檔」或「取消歸檔」按鈕,兩者都由 htmx 提供支援,並向不同的端點發出 HTTP 請求。

當我們點擊顯示的兩個按鈕中的任何一個時,我們希望將按鈕周圍的 div 中的內容替換為更新的按鈕。(請注意 div 上的 hx-target="this",因此我們針對該 div 的 innerHTML 進行替換。)這將有效地在「歸檔」和「取消歸檔」之間來回切換。

現在,不幸的是,如果我們只想渲染按鈕而不是此模板的其餘部分,這通常需要將按鈕拆分到它們自己的模板檔案中,並將其包含在此模板中,如下所示

#/contacts/detail.html
<html>
    <body>
        <div hx-target="this">
          #include archive-ui.html
        </div>
        <h3>Contact</h3>
        <p>${contact.email}</p>
    </body>
</html>
#/contacts/archive-ui.html
#if contact.archived
<button hx-patch="/contacts/${contact.id}/unarchive">Unarchive</button>
#else
<button hx-delete="/contacts/${contact.id}">Archive</button>
#end

現在我們有兩個模板。我們現在可以單獨渲染 archive-ui.html 模板,但這種拆分降低了歸檔功能的可見性:當您只查看 detail.html 模板時,不太容易看出發生了什麼。

當推到極端時,像這樣分解模板可能會導致相當多的小模板片段,這些片段加起來,會變得難以管理和推論。

#模板片段來救援

為了解決這個問題,chill 模板有一個 #fragment 指令。此指令允許您在模板中指定一個內容塊,並僅渲染該部分內容

#/contacts/detail.html 使用片段
<html>
    <body>
        <div hx-target="this">
          #fragment archive-ui
            #if contact.archived
            <button hx-patch="/contacts/${contact.id}/unarchive">Unarchive</button>
            #else
            <button hx-delete="/contacts/${contact.id}">Archive</button>
            #end
          #end
        </div>
        <h3>Contact</h3>
        <p>${contact.email}</p>
    </body>
</html>

在我們的模板中定義了這個片段之後,我們現在可以渲染整個模板

  Contact c = getContact();
  ChillTemplates.render("/contacts/detail.html", "contact", c);

或者我們可以只渲染模板的 archive-ui 片段

  Contact c = getContact();
  ChillTemplates.render("/contacts/detail.html#archive-ui", "contact", c);

當我們想要渲染聯絡人的整個詳細資訊頁面時,我們會使用第一個選項。

當我們處理歸檔/取消歸檔操作並只想重新渲染按鈕時,我們會使用第二個選項。

請注意,使用片段,我們能夠將我們的 UI 保存在單一檔案中,並清楚地看到該功能正在發生的情況,而無需在不同的模板檔案之間跳轉。這提供了一個更清晰且更明顯的功能實現。

#已知的模板片段實作

片段(以及在控制器中直接渲染它們的能力)在模板庫中似乎是一個相對罕見的功能,並且在處理 htmx 和其他以超媒體為導向的函式庫時,為改善開發人員體驗提供了絕佳的機會。

以下是一些已知的片段概念實作

如果您知道其他實作,請告訴我,以便我可以將它們添加到此列表中。

</>