元数据

到目前为止,我们渲染的所有内容都在 HTML 文档的 <body> 内部。这很有道理。毕竟,你在网页上看到的所有内容都位于 <body> 内部。

但是,有很多情况下,你可能希望使用与 UI 相同的响应式原语和组件模式来更新文档 <head> 中的内容。

这就是 leptos_meta 包的用武之地。

元数据组件

leptos_meta 提供了特殊的组件,让你可以将应用程序中任何地方的组件内部的数据注入到 <head> 中:

<Title/> 允许你从任何组件设置文档的标题。它还接受一个 formatter 函数,该函数可用于将相同的格式应用于其他页面设置的标题。因此,例如,如果你在 <App/> 组件中放入 <Title formatter=|text| format!("{text} — My Awesome Site")/>,然后在你的路由上放入 <Title text="Page 1"/><Title text="Page 2"/>,你将获得 Page 1 — My Awesome SitePage 2 — My Awesome Site

<Link/> 接受 <link> 元素的标准属性。

<Stylesheet/> 使用你提供的 href 创建一个 <link rel="stylesheet">

<Style/> 使用你传入的子级(通常是一个字符串)创建一个 <style>。你可以使用它在编译时从另一个文件中导入一些自定义 CSS <Style>{include_str!("my_route.css")}</Style>

<Meta/> 让你可以使用描述和其他元数据设置 <meta> 标签。

<Script/><script>

leptos_meta 还提供了一个 <Script/> 组件,在这里值得停顿一下。我们考虑过的所有其他组件都在 <head> 中注入了仅限 <head> 的元素。但是 <script> 也可以包含在 body 中。

有一种非常简单的方法可以确定你应该使用大写字母 S 的 <Script/> 组件还是小写字母 s 的 <script> 元素:<Script/> 组件将在 <head> 中渲染,而 <script> 元素将在你的用户界面 <body> 中你放置它的任何位置渲染,与其他普通 HTML 元素一起渲染。这些会导致 JavaScript 在不同的时间加载和运行,因此请使用适合你需求的任何一种。

<Body/><Html/>

甚至还有一些元素旨在使语义 HTML 和样式更容易。<Html/> 让你可以从你的应用程序代码中设置 <html> 标签上的 langdir<Html/><Body/> 都有 class props,让你可以设置它们各自的 class 属性,这有时是 CSS 框架用于样式设置所需要的。

<Body/><Html/> 都有 attributes props,可以使用 attr: 语法在它们上面设置任意数量的附加属性:

<Html
	lang="he"
	dir="rtl"
	attr:data-theme="dark"
/>

元数据和服务器端渲染

现在,其中一些内容在任何场景下都很有用,但其中一些内容对搜索引擎优化(SEO)尤其重要。确保你拥有适当的 <title><meta> 标签等内容至关重要。现代搜索引擎爬虫确实会处理客户端渲染,即作为空 index.html 发送并完全在 JS/WASM 中渲染的应用程序。但它们更喜欢接收你的应用程序已渲染为实际 HTML 的页面,并在 <head> 中包含元数据。

这正是 leptos_meta 的用途。事实上,在服务器端渲染期间,它正是这样做的:收集你通过在整个应用程序中使用其组件声明的所有 <head> 内容,然后将其注入到实际的 <head> 中。

但我跑题了。我们还没有真正讨论服务器端渲染。下一章将讨论与 JavaScript 库的集成。然后我们将结束对客户端的讨论,并转到服务器端渲染。