type | title | description |
---|---|---|
tutorial |
编写你的第一个布局 |
教程:搭建你的 Astro 博客 -
将常见元素重构为可复用的页面布局 |
import Box from '/components/tutorial/Box.astro';
import Checklist from '/components/Checklist.astro';
import MultipleChoice from '/components/tutorial/MultipleChoice.astro';
import Option from '/components/tutorial/Option.astro';
import PreCheck from '~/components/tutorial/PreCheck.astro';
import { Steps } from '@astrojs/starlight/components';
你现在仍然在每个页面上重复渲染一些 Astro 组件。是时候再次重构,创建一个共享的页面布局!
1. 创建一个新文件:`src/layouts/BaseLayout.astro`(你需要首先创建一个 `layouts` 文件夹)。-
将
index.astro
的全部内容复制到你的新文件BaseLayout.astro
中。--- import Header from '../components/Header.astro'; import Footer from '../components/Footer.astro'; import '../styles/global.css'; const pageTitle = "首页"; --- <html lang="zh-cn"> <head> <meta charset="utf-8" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <meta name="viewport" content="width=device-width" /> <meta name="generator" content={Astro.generator} /> <title>{pageTitle}</title> </head> <body> <Header /> <h1>{pageTitle}</h1> <Footer /> <script> import "../scripts/menu.js"; </script> </body> </html>
```astro title="src/pages/index.astro"
---
import BaseLayout from '../layouts/BaseLayout.astro';
const pageTitle = "首页";
---
<BaseLayout>
<h2>My awesome blog subtitle</h2>
</BaseLayout>
```
-
再次查看浏览器预览,注意到发生了什么变化(或者直接剧透:没有变化!)。
-
在
src/layouts/BaseLayout.astro
的页脚组件上方添加一个<slot />
元素,然后查看你的首页在浏览器的预览中真正发生了什么变化!--- import Header from '../components/Header.astro'; import Footer from '../components/Footer.astro'; import '../styles/global.css'; const pageTitle = "首页"; --- <html lang="zh-cn"> <head> <meta charset="utf-8" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <meta name="viewport" content="width=device-width" /> <meta name="generator" content={Astro.generator} /> <title>{pageTitle}</title> </head> <body> <Header /> <h1>{pageTitle}</h1> <slot /> <Footer /> <script> import "../scripts/menu.js"; </script> </body> </html>
<slot />
允许你将写在开放和闭合 <Component></Component>
标签之间的子内容注入(或者说是「插入」)到任何 Component.astro
文件中。
```astro title="src/pages/index.astro" 'pageTitle={pageTitle}'
---
import BaseLayout from '../layouts/BaseLayout.astro';
const pageTitle = "首页";
---
<BaseLayout pageTitle={pageTitle}>
<h2>My awesome blog subtitle</h2>
</BaseLayout>
```
-
将
BaseLayout.astro
布局组件的脚本更改为通过Astro.props
接收页面标题,而不是将其定义为常量。--- import Header from '../components/Header.astro'; import Footer from '../components/Footer.astro'; import '../styles/global.css'; const pageTitle = "首页"; const { pageTitle } = Astro.props; ---
-
检查你的浏览器预览,确认页面标题是否有变动。它应该和之前一样,但现在是动态渲染的。现在,每个独立的页面都可以指定自己的标题给布局。
重构你的其他页面(blog.astro
和 about.astro
),使它们使用你的新的 <BaseLayout>
组件来渲染共同的页面元素。
不要忘记:
-
通过组件属性将页面标题作为 props 传递。
-
让布局负责渲染任何共同的 HTML。
-
从每个页面中删除现在由布局处理的任何内容,包括:
- HTML 元素
- 组件及其导入语句
<style>
标签中的 CSS 样式(例如,你的 About 页面中的<h1>
)<script>
标签
-
Astro 组件(
页面 UI 组件 布局 以上全部,因为 Astro 组件非常实用!🏗️.astro
文件)可以用作: -
要在页面上显示页面标题,你可以
在页面上使用带有静态文本的标准 HTML 元素(例如 ``) 在页面上使用标准 HTML 元素,引用在组件的前置脚本中定义的变量(例如 ``) 在页面上使用布局组件,通过组件属性传递标题(例如 `` 或 ``) 以上全部,因为 Astro 可以让你使用普通的 HTML 或加强它的功能,使用一些脚本和组件!💪 -
可以通过以下什么方式将信息从一个组件传递到另一个组件:
导入一个 UI 组件,并在另一个组件的模板中渲染它 通过组件属性将 props 传递给渲染它的组件 使用 `` 占位符,将要在另一个组件中呈现的 HTML 内容发送过去 以上全部,因为 Astro 构建时就考虑了组件化设计!🧩