页面
Syntax
page
在接收到上下文中的Page
对象的模板的顶级位置,以下语句是等价的:
{{ .Params.foo }}
{{ .Page.Params.foo }}
{{ page.Params.foo }}
当Page
对象不在上下文中时,您可以使用全局的page
函数:
{{ page.Params.foo }}
解释
Hugo 几乎总是将 Page
作为数据上下文传递给顶级模板(例如 single.html
)。唯一的例外是 multihost sitemap 模板。这意味着您可以在模板中使用 .
变量访问当前页面。
但是,当您在内容视图、partial或render hook的深层嵌套中时,直接访问Page
对象不总是切实可行的。
使用全局的 page
函数可以在任何模板的任何地方访问 Page
对象。
警告
注意顶级上下文
全局的 page
函数访问传递到顶级模板的 Page
对象。
假设有以下内容结构:
content/
├── posts/
│ ├── post-1.md
│ ├── post-2.md
│ └── post-3.md
└── _index.md <-- title is "My Home Page"
以及主页模板中的以下代码:
{{ range site.Sections }}
{{ range .Pages }}
{{ .Title }}
{{ end }}
{{ end }}
渲染的输出将会是:
My Home Page
My Home Page
My Home Page
在上面的示例中,全局的 page
函数访问传递给主页模板的 Page
对象,而不是被迭代页面的 Page
对象。
注意缓存
不要在以下位置使用全局的 page
函数:
- Shortcode 中
- 被 shortcode 调用的 partial 中
- 被
partialCached
函数缓存的 partial 中
Hugo 会缓存渲染过的 shortcodes。如果在 shortcode 中使用了 global
page 函数,而且该页面内容在两个或更多个模板中进行渲染,那么缓存的 shortcode 可能会不正确。
考虑以下 section 模板:
{{ range .Pages }}
<h2><a href="{{ .RelPermalink }}">{{ .Title }}</a></h2>
{{ .Summary }}
{{ end }}
在调用 .Summary
方法时,Hugo 会渲染页面的 .Content
,其中包括 shortcodes。在这种情况下,shortcode 内部的全局 page
函数会访问 section 页面的 Page
对象,而不是内容页面。
如果 Hugo 先渲染 section 页面,再渲染内容页面,那么缓存的渲染过的 shortcode 将会不正确。由于并发性,您无法控制渲染顺序。