局部模板
在模板中使用局部模板
Hugo 项目的所有局部模板都位于单个 layouts/partials
目录中。为了更好地组织,您也可以在 partials
中创建多个子目录:
layouts/
└── partials/
├── footer/
│ ├── scripts.html
│ └── site-footer.html
├── head/
│ ├── favicons.html
│ ├── metadata.html
│ ├── prerender.html
│ └── twitter.html
└── header/
├── site-header.html
└── site-nav.html
所有局部模板都使用以下模式在您的模板中调用:
{{ partial "<PATH>/<PARTIAL>.html" . }}
如上例所示的目录结构,您可以将目录嵌套在 partials
中以更好地组织源代码。您只需要调用相对于 partials
目录的嵌套局部模板的路径:
{{ partial "header/site-header.html" . }}
{{ partial "footer/scripts.html" . }}
变量作用域
局部模板调用的第二个参数是传递的变量。上面的例子传递了 .
,这告诉接收局部模板的模板应用当前的 上下文 。
这意味着局部模板只能访问这些变量。局部模板是隔离的,不能访问外部作用域。在局部模板中, $.Var
等价于 .Var
。
从局部模板返回值
除了输出标记之外,局部模板还可以用于返回任何类型的返回值。为了返回值,局部模板必须在局部模板的末尾包含一个单独的 return
语句。
示例 GetFeatured
{{/* layouts/partials/GetFeatured.html */}}
{{ return first . (where site.RegularPages "Params.featured" true) }}
{{/* layouts/index.html */}}
{{ range partial "GetFeatured.html" 5 }}
[...]
{{ end }}
示例 GetImage
{{/* layouts/partials/GetImage.html */}}
{{ $image := false }}
{{ with .Params.gallery }}
{{ $image = index . 0 }}
{{ end }}
{{ with .Params.image }}
{{ $image = . }}
{{ end }}
{{ return $image }}
{{/* layouts/_default/single.html */}}
{{ with partial "GetImage.html" . }}
[...]
{{ end }}
内联局部模板
您也可以在模板中内联定义局部模板。但请记住,模板命名空间是全局的,因此您需要确保名称是唯一的,以避免冲突。
Value: {{ partial "my-inline-partial.html" . }}
{{ define "partials/my-inline-partial.html" }}
{{ $value := 32 }}
{{ return $value }}
{{ end }}
缓存局部模板
partialCached
模板函数为不需要在每次调用时都重新渲染的复杂模板提供了显著的性能提升。参见 详情 。
示例
header.html
以下 header.html
局部模板用于 spf13.com :
layouts/partials/header.html
<!DOCTYPE html>
<html class="no-js" lang="en-US" prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb#">
<head>
<meta charset="utf-8">
{{ partial "meta.html" . }}
<base href="{{ .Site.BaseURL }}">
<title> {{ .Title }} : spf13.com </title>
<link rel="canonical" href="{{ .Permalink }}">
{{ if .RSSLink }}<link href="{{ .RSSLink }}" rel="alternate" type="application/rss+xml" title="{{ .Title }}" />{{ end }}
{{ partial "head_includes.html" . }}
</head>
footer.html
以下 footer.html
局部模板用于 spf13.com :