深色模式
8.2 可参数化的片段签名
为了让模板片段具备类似「函数」的复用能力,通过 th:fragment 定义的片段可以指定参数列表,实现片段的动态传参。
html
<!-- 定义名为 frag 的片段,接收 onevar、twovar 两个参数 -->
<div th:fragment="frag (onevar,twovar)">
<p th:text="${onevar} + ' - ' + ${twovar}">参数1 - 参数2</p>
</div>在th:insert、th:replace语法中调用时,需在片段表达式中传递参数,支持两种语法:
html
<div th:replace="~{ ::frag (${value1},${value2}) }">...</div>
<div th:replace="~{ ::frag (onevar=${value1},twovar=${value2}) }">...</div>注意:通过 参数名=${值} 的格式传参,参数顺序可任意调整,可读性更高:
html
<!-- 顺序调换依然有效 -->
<div th:replace="~{ ::frag (twovar=${value2},onevar=${value1}) }">...</div>核心说明
- 参数作用域:传入的参数仅在当前片段内有效,不会影响目标模板的上下文变量;
- 简化写法:依然可以省略片段表达式的
~{}包裹符,简写为:html<div th:replace="::frag (onevar=${value1},twovar=${value2})"></div> - 默认值(扩展):如果需要给参数设置默认值,可在片段内通过
EL 表达式实现:html<!-- onevar 无传参时,默认值为 "默认参数1" --> <div th:fragment="frag (onevar,twovar)"> <p th:text="${onevar ?: '默认参数1'} + ' - ' + ${twovar}">...</p> </div> - 跨模板传参:调用其他模板的带参片段时,语法一致:html
<!-- 调用 common.html 中的 frag 片段,传递参数 --> <div th:replace="~{common :: frag (onevar=${value1},twovar=${value2})}"></div>
实用示例(动态导航片段)
html
<!-- 定义带参数的导航片段:接收 activeMenu 参数,标记当前激活的菜单 -->
<div th:fragment="nav (activeMenu)">
<ul class="nav">
<li th:class="${activeMenu == 'home' ? 'active' : ''}">
<a th:href="@{/home}">首页</a>
</li>
<li th:class="${activeMenu == 'product' ? 'active' : ''}">
<a th:href="@{/product}">产品</a>
</li>
</ul>
</div>
<!-- 调用片段,指定当前激活的是产品菜单 -->
<div th:replace="::nav (activeMenu='product')"></div>总结
- 带参数的片段签名通过
th:fragment="片段名(参数1,参数2)"定义,让片段具备动态复用能力; - 调用时支持「按位置传参」(顺序敏感)和「按名称传参」(顺序无关,推荐);
- 片段参数仅作用于片段内部,可结合 EL 表达式设置默认值,适配更多复用场景。
