深色模式
空片段表达式(~{})的使用
Thymeleaf 提供了一个特殊的片段表达式——空片段 ~{},用于明确指定「不传递任何标记内容」。结合之前的通用头部片段示例,我们可以更灵活地控制片段参数的渲染。
html
<!-- 调用 common_header 片段,links 参数传入空片段 -->
<head th:replace="~{ base :: common_header(~{::title},~{}) }">
<!-- 仅传递自定义标题,无自定义链接 -->
<title>Awesome - Main</title>
</head>由于 links 参数被设为空片段,通用片段中 <th:block th:replace="${links}" /> 这一行不会渲染任何内容,最终结果仅保留通用头部的公共内容和自定义标题:
html
<head>
<!-- 来自调用模板的自定义标题 -->
<title>Awesome - Main</title>
<!-- 通用样式/脚本(片段自带) -->
<link rel="stylesheet" type="text/css" media="all" href="/awe/css/awesomeapp.css">
<link rel="shortcut icon" href="/awe/images/favicon.ico">
<script type="text/javascript" src="/awe/sh/scripts/codebase.js"></script>
<!-- links 参数为空,无额外自定义链接 -->
</head>3. 关键说明
- 空片段 vs 不传参:
- 空片段
~{}是「主动指定无内容」,片段中对应th:replace="${参数}"的位置会直接忽略,不生成任何标签; - 若不传该参数,片段会尝试使用上下文变量(若不存在则可能报错),或渲染默认占位符(如果定义了);
- 空片段
- 简化写法:空片段也可省略
~{},直接写''或null,效果一致:html<!-- 等价写法:用空字符串替代空片段 --> <head th:replace="base :: common_header(::title,'')"> <title>Awesome - Main</title> </head> - 适用场景:
- 页面无需自定义某类内容(如无自定义样式链接、无自定义脚本);
- 统一参数传递格式,避免因“不传参数”导致的模板异常;
- 动态控制片段渲染:结合条件表达式,按需传递内容或空片段:html
<!-- 仅当用户是管理员时传递自定义链接,否则传空片段 --> <head th:replace="base :: common_header( ::title, ${user.isAdmin} ? ::link : ~{} )"> <title>Admin - Dashboard</title> <link rel="stylesheet" th:href="@{/css/admin.css}"> </head>
4. 对比示例:传参 vs 空片段
| 调用方式 | 渲染结果特点 |
|---|---|
common_header(::title,::link) | 包含自定义标题 + 自定义链接 |
common_header(::title,~{}) | 仅包含自定义标题,无自定义链接 |
common_header(~{},::link) | 仅包含自定义链接,标题用片段默认 |
总结
- 空片段表达式
~{}用于明确指定“无标记内容”,传递给片段参数后,对应位置不会渲染任何内容; - 相比“不传参数”,空片段更可控,能避免模板因参数缺失报错,且语义更清晰;
- 常结合条件表达式使用,实现“按需传递自定义标记”,进一步提升布局的灵活性。
