构建你的第一个布局
准备好……
- 将通用元素重构为页面布局
- 使用 Astro 的
<slot />
元素将页面内容放置在布局中 - 将页面特定值作为 props 传递给其布局
你仍然有一些 Astro 组件在每个页面上重复渲染。是时候再次重构以创建一个共享的页面布局了!
创建你的第一个布局组件
名为“创建你的第一个布局组件”的部分-
在
src/layouts/BaseLayout.astro
位置创建一个新文件。(你需要先创建一个新的layouts
文件夹。) -
将
index.astro
的 全部内容 复制到你的新文件BaseLayout.astro
中。src/layouts/BaseLayout.astro ---import Header from '../components/Header.astro';import Footer from '../components/Footer.astro';import '../styles/global.css';const pageTitle = "Home Page";---<html lang="en"><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>
在页面上使用你的布局
名为“在页面上使用你的布局”的部分-
用以下内容替换
src/pages/index.astro
中的代码src/pages/index.astro ---import BaseLayout from '../layouts/BaseLayout.astro';const pageTitle = "Home Page";---<BaseLayout><h2>My awesome blog subtitle</h2></BaseLayout> -
再次检查浏览器预览,注意有什么变化(或者,剧透一下:什么都没有变!)。
-
在
src/layouts/BaseLayout.astro
的页脚组件正上方添加一个<slot />
元素,然后检查你的主页的浏览器预览,看看这次真正有什么变化!src/layouts/BaseLayout.astro ---import Header from '../components/Header.astro';import Footer from '../components/Footer.astro';import '../styles/global.css';const pageTitle = "Home Page";---<html lang="en"><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
文件中。
将页面特定值作为 props 传递
名为“将页面特定值作为 props 传递”的部分-
使用组件属性将页面标题从
index.astro
传递给你的布局组件src/pages/index.astro ---import BaseLayout from '../layouts/BaseLayout.astro';const pageTitle = "Home Page";---<BaseLayout pageTitle={pageTitle}><h2>My awesome blog subtitle</h2></BaseLayout> -
更改
BaseLayout.astro
布局组件的脚本,以通过Astro.props
接收页面标题,而不是将其定义为常量。src/layouts/BaseLayout.astro ---import Header from '../components/Header.astro';import Footer from '../components/Footer.astro';import '../styles/global.css';const pageTitle = "Home Page";const { pageTitle } = Astro.props;--- -
检查你的浏览器预览,验证页面标题没有改变。它的值相同,但现在是动态渲染的。现在,每个单独的页面都可以为布局指定自己的标题。
亲自动手 - 在所有地方使用你的布局
名为“亲自动手 - 在所有地方使用你的布局”的部分重构 你的其他页面(blog.astro
和 about.astro
),使它们使用你新的 <BaseLayout>
组件来渲染公共页面元素。
别忘了
-
通过组件属性将页面标题作为 props 传递。
-
让布局负责渲染任何通用元素的 HTML。
-
将页面
<head>
中任何你希望保留的现有<style>
标签移动到页面的 HTML 模板中。 -
从每个单独的页面中删除现在由布局处理的任何内容,包括
- HTML 元素
- 组件及其导入
<style>
标签中的 CSS 规则(例如,你的“关于”页面中的<h1>
)<script>
标签
使用 <BaseLayout>
渲染你的 about.astro
页面意味着你将丢失添加到此页面 <head>
中的 <style>
标签。要继续使用 Astro 的局部作用域样式仅在页面级别设置项目样式,请将 <style>
标签移动到页面组件的主体部分。这允许你为在此页面组件中创建的元素(例如你的技能列表)设置样式。
由于你的 <h1>
现在是由布局组件创建的,你可以将 is:global
属性添加到你的样式标签中,以影响此页面上的每个元素,包括由其他组件创建的元素:<style is:global define:vars={{ skillColor, fontWeight, textCase }}>
知识测验
名为“测试你的知识”的部分-
一个 Astro 组件(
.astro
文件)可以作为一个 -
要在页面上显示页面标题,你可以
-
信息可以通过以下方式从一个组件传递到另一个组件