Skip to content

无需片段参数的片段局部变量

即便片段定义时没有声明参数(即 th:fragment 后无参数列表):

html
<!-- 无参数签名的片段 -->
<div th:fragment="frag">
    ...
</div>

我们依然可以给片段传递局部变量——但只能使用「按名称传参」这一种语法。

html
<!-- 仅支持按名称传参,给无参数片段传局部变量 -->
<div th:replace="~{::frag (onevar=${value1},twovar=${value2})}"></div>

上述写法完全等价于「先通过 th:with 定义局部变量,再引入片段」,本质是给片段执行上下文添加临时变量:

html
<!-- 等价写法:th:with 定义局部变量,th:replace 引入片段 -->
<div th:replace="~{::frag}" th:with="onevar=${value1},twovar=${value2}"></div>

需要注意的是,为片段指定这些局部变量 —— 无论该片段是否定义了参数签名 —— 都不会导致片段执行前清空上下文环境。片段仍能像当前这样,访问调用模板中正在使用的所有上下文变量。

实用示例(动态文本片段)

html
<!-- 无参数的通用文本片段 -->
<div th:fragment="text-box">
  <div class="box" th:text="${boxTitle}">默认标题</div>
  <p th:text="${boxContent}">默认内容</p>
</div>

<!-- 调用时传递局部变量,无需修改片段定义 -->
<div th:replace="::text-box (boxTitle='产品介绍', boxContent=${prod.desc})"></div>

总结

  1. 无参数签名的片段也能通过「按名称传参」传递局部变量,等价于 th:replace + th:with
  2. 片段局部变量不会清空原有上下文,可同时访问全局变量和局部变量;
  3. 该特性让片段无需提前声明参数,也能动态适配不同的传参需求,提升复用灵活性。