深色模式
6.2 跟踪遍历状态
使用 th:each 时,Thymeleaf 提供了一个实用的机制来跟踪遍历的状态——即「状态变量(status variable)」。
状态变量需在 th:each 属性中定义,它包含以下关键数据:
| 状态变量属性 | 说明 |
|---|---|
index | 当前遍历的索引,从 0 开始计数 |
count | 当前遍历的序号,从 1 开始计数 |
size | 被遍历集合的总元素数量 |
current | 当前遍历到的元素(等价于迭代变量) |
even/odd | 布尔值,当前是否为偶数/奇数行(索引) |
first | 布尔值,当前是否为第一个元素 |
last | 布尔值,当前是否为最后一个元素 |
结合之前的产品列表示例,我们用状态变量给奇数行添加 CSS 类:
html
<table>
<tr>
<th>NAME</th>
<th>PRICE</th>
<th>IN STOCK</th>
</tr>
<!-- 显式定义状态变量 iterStat:格式为「迭代变量, 状态变量 : 集合」 -->
<tr th:each="prod,iterStat : ${prods}" th:class="${iterStat.odd}? 'odd'">
<td th:text="${prod.name}">Onions</td>
<td th:text="${prod.price}">2.41</td>
<td th:text="${prod.inStock}? #{true} : #{false}">yes</td>
</tr>
</table>状态变量(本示例中为 iterStat)是在 th:each 属性中定义的 —— 只需将其名称写在迭代变量之后,并用逗号分隔即可。与迭代变量一样,状态变量的作用域也仅限于持有 th:each 属性的标签所定义的代码片段范围内。
我们来看一下处理该模板后的输出结果:
html
<table>
<tr>
<th>NAME</th>
<th>PRICE</th>
<th>IN STOCK</th>
</tr>
<tr class="odd">
<td>Fresh Sweet Basil</td>
<td>4.99</td>
<td>yes</td>
</tr>
<tr>
<td>Italian Tomato</td>
<td>1.25</td>
<td>no</td>
</tr>
<tr class="odd">
<td>Yellow Bell Pepper</td>
<td>2.50</td>
<td>yes</td>
</tr>
<tr>
<td>Old Cheddar</td>
<td>18.75</td>
<td>yes</td>
</tr>
</table>请注意,我们的迭代状态变量已完美生效 —— 仅为奇数行添加了 odd 这个 CSS 类。
如果你没有显式定义状态变量,Thymeleaf 会自动为你创建一个:它会在迭代变量名称后拼接 Stat 作为该状态变量的名称。
html
<table>
<tr>
<th>NAME</th>
<th>PRICE</th>
<th>IN STOCK</th>
</tr>
<tr th:each="prod : ${prods}" th:class="${prodStat.odd}? 'odd'">
<td th:text="${prod.name}">Onions</td>
<td th:text="${prod.price}">2.41</td>
<td th:text="${prod.inStock}? #{true} : #{false}">yes</td>
</tr>
</table>状态变量的高频使用场景
html
<!-- 1. 显示行号(count 从 1 开始) -->
<tr th:each="prod,stat : ${prods}">
<td th:text="${stat.count}">1</td> <!-- 行号 -->
<td th:text="${prod.name}">Onions</td>
</tr>
<!-- 2. 给第一个/最后一个元素加特殊样式 -->
<tr th:each="prod,stat : ${prods}"
th:class="${stat.first}? 'first-row' : (${stat.last}? 'last-row' : '')">
<td th:text="${prod.name}">Onions</td>
</tr>
<!-- 3. 显示总条数 -->
<div>总产品数:<span th:text="${prodStat.size}">0</span></div>总结
- 状态变量是
th:each遍历的辅助工具,可获取索引、序号、奇偶行、首尾元素等遍历信息; - 显式定义格式为「迭代变量, 状态变量 : 集合」,隐式生成规则是「迭代变量 + Stat」;
- 状态变量常用于设置奇偶行样式、显示行号、标记首尾元素等场景,是列表渲染的核心辅助手段。
