深入了解th:fragment

一、th:fragment是什麼

th:fragment是Thymeleaf模板引擎提供的一種抽象機制,它允許我們將頁面的某個片段定義為可重用的代碼塊。

在HTML文件中,我們可以通過使用<th:fragment>標籤定義一個代碼片段,並設置一個名稱。這個名稱可以在頁面中任何位置進行引用,並將這個片段替換成實際的代碼塊。

<!-- 在HTML文件中定義一個名為「header」的th:fragment -->
<th:fragment name="header">
    <header>
        <nav>
            <ul>
                <li><a href="#">Menu 1</a></li>
                <li><a href="#">Menu 2</a></li>
                <li><a href="#">Menu 3</a></li>
            </ul>
        </nav>
    </header>
</th:fragment>

二、th:fragment的使用方法

1. 使用th:replace引用th:fragment

在HTML文件中,我們可以通過使用<th:replace>標籤來引用已經定義的th:fragment。這將會將定義的代碼片段替換成<th:replace>標籤內嵌套的HTML代碼。

<!-- 在HTML文件中引用名為「header」的th:fragment -->
<div th:replace="fragments :: header"></div>

上面這行代碼的fragments :: header這個表達式,其中fragments是Thymeleaf模板引擎提供的默認前綴,代表查找的是th:fragment,header就是我們定義的片段名稱。

2. 使用th:include引用th:fragment

與th:replace相似,我們可以使用<th:include>標籤來引用th:fragment,但是與th:replace不同的是,th:include不會替換掉當前標籤。

下面代碼演示了如何使用th:include來引用th:fragment:

<!-- 在HTML文件中引用名為「footer」的th:fragment -->
<div>
    <div>這是內容區域</div>
    <!-- 在這裡引用名為「footer」的th:fragment,並將其添加到div標籤中 -->
    <div th:include="fragments :: footer">頁面下方</div>
</div>

需要注意的是,使用th:include引用th:fragment時,我們需要保證最終的HTML代碼片段不會造成語法錯誤,例如引用一個</div>結束標籤,但是在引用的頁面中沒有與之對應的<div>開始標籤,這將會導致語法錯誤。

3. 使用th:insert引用th:fragment

在使用th:insert標籤引用th:fragment時,如果我們所引用的標籤不存在,就會直接插入這個定義好的th:fragment的HTML片段。

<!-- 在HTML文件中引用名為「test」的th:fragment -->
<div>這是內容區域</div>

<!-- 如果沒有定義所引用的標籤,則會將th:insert標籤替換成這個HTML片段 -->
<th:insert th:fragment="test">
  <h2>片段內的標題,如果引用成功,這個標題將不會被顯示</h2>
</th:insert>

三、th:fragment的注意事項

1. 定義和引用th:fragment的位置

我們應當將th:fragment定義在<body>標籤中的頂層元素內,這樣我們就可以在任何一個子元素中引用它。如果將th:fragment定義在了某個特定的子元素中,它只能在這個特定的子元素內部被引用。

2. th:fragment不能作為標籤的屬性

在HTML文件中,th:fragment是不能夠作為標籤的屬性出現的。例如,下面的代碼將會導致語法錯誤:

<nav th:fragment="test">
  <ul>
    <li><a href="#">Menu 1</a></li>
    <li><a href="#">Menu 2</a></li>
    <li><a href="#">Menu 3</a></li>
  </ul>
</nav>

正確的寫法應該是將th:fragment定義在nav標籤的內部,如下所示:

<nav>
  <th:fragment name="test">
    <ul>
      <li><a href="#">Menu 1</a></li>
      <li><a href="#">Menu 2</a></li>
      <li><a href="#">Menu 3</a></li>
    </ul>
  </th:fragment>
</nav>

3. th:fragment中的變數引用

當我們在一個th:fragment中引用變數時,這個變數將會被當作局部變數。這意味著,這個變數的值只能在這個th:fragment中被訪問。

下面是一個示例代碼:

<th:fragment name="greet">
  <p th:text="${message}">Hello, World!</p>
</th:fragment>

<!-- 在另一個地方引用greet片段 -->
<div th:replace="fragments :: greet(message='Hello, Me!')" ></div>

在上面的代碼中,我們在引用greet片段時,以message=’Hello, Me!’的形式傳遞了一個參數。這個參數將會在greet片段中被識別為局部變數。

四、總結

th:fragment是Thymeleaf模板引擎提供的一種強大的代碼片段抽象機制,可以幫助我們更加有效、簡潔地編寫HTML文件以及增強代碼的可維護性。

五、代碼示例

本文所涉及到的代碼,可供參考:

<!-- /src/main/resources/templates/fragments.html -->
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Thymeleaf template engine</title>
</head>
<body>

  <!-- 定義greet片段 -->
  <th:fragment name="greet">
    <p th:text="${message}">Hello, World!</p>
  </th:fragment>

  <!-- 定義footer片段 -->
  <th:fragment name="footer">
    <footer>
      <hr>
      <p>頁腳內容</p>
    </footer>
  </th:fragment>

</body>
</html>

<!-- 在HTML文件中引用greet和footer片段 -->
<html>
<head>
  <meta charset="UTF-8">
  <title>Thymeleaf template engine</title>
</head>
<body>

  <!-- 引用greet片段 -->
  <div th:replace="fragments :: greet(message='Hello, Me!')"></div>

  <!-- 引用footer片段 -->
  <div>
    <div>這是內容區域</div>
    <div th:include="fragments :: footer">頁面下方</div>
  </div>

  <!-- 在不存在的標籤內使用th:insert引用片段 -->
  <th:insert th:fragment="test">
    <h2>片段內的標題,如果引用成功,這個標題將不會被顯示</h2>
  </th:insert>

</body>
</html>

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/271293.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-16 14:54
下一篇 2024-12-16 14:54

相關推薦

  • 深入解析Vue3 defineExpose

    Vue 3在開發過程中引入了新的API `defineExpose`。在以前的版本中,我們經常使用 `$attrs` 和` $listeners` 實現父組件與子組件之間的通信,但…

    編程 2025-04-25
  • 深入理解byte轉int

    一、位元組與比特 在討論byte轉int之前,我們需要了解位元組和比特的概念。位元組是計算機存儲單位的一種,通常表示8個比特(bit),即1位元組=8比特。比特是計算機中最小的數據單位,是…

    編程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什麼是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一個內置小部件,它可以監測數據流(Stream)中數據的變…

    編程 2025-04-25
  • 深入探討OpenCV版本

    OpenCV是一個用於計算機視覺應用程序的開源庫。它是由英特爾公司創建的,現已由Willow Garage管理。OpenCV旨在提供一個易於使用的計算機視覺和機器學習基礎架構,以實…

    編程 2025-04-25
  • 深入了解scala-maven-plugin

    一、簡介 Scala-maven-plugin 是一個創造和管理 Scala 項目的maven插件,它可以自動生成基本項目結構、依賴配置、Scala文件等。使用它可以使我們專註於代…

    編程 2025-04-25
  • 深入了解LaTeX的腳註(latexfootnote)

    一、基本介紹 LaTeX作為一種排版軟體,具有各種各樣的功能,其中腳註(footnote)是一個十分重要的功能之一。在LaTeX中,腳註是用命令latexfootnote來實現的。…

    編程 2025-04-25
  • 深入剖析MapStruct未生成實現類問題

    一、MapStruct簡介 MapStruct是一個Java bean映射器,它通過註解和代碼生成來在Java bean之間轉換成本類代碼,實現類型安全,簡單而不失靈活。 作為一個…

    編程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一個程序就是一個模塊,而一個模塊可以引入另一個模塊,這樣就形成了包。包就是有多個模塊組成的一個大模塊,也可以看做是一個文件夾。包可以有效地組織代碼和數據…

    編程 2025-04-25
  • 深入理解Python字元串r

    一、r字元串的基本概念 r字元串(raw字元串)是指在Python中,以字母r為前綴的字元串。r字元串中的反斜杠(\)不會被轉義,而是被當作普通字元處理,這使得r字元串可以非常方便…

    編程 2025-04-25
  • 深入探討馮諾依曼原理

    一、原理概述 馮諾依曼原理,又稱「存儲程序控制原理」,是指計算機的程序和數據都存儲在同一個存儲器中,並且通過一個統一的匯流排來傳輸數據。這個原理的提出,是計算機科學發展中的重大進展,…

    編程 2025-04-25

發表回復

登錄後才能評論