跳转到内容

构建你的第一个 Astro Island

使用 Preact 组件,用随机选择的欢迎消息来问候你的访客!

准备好去…

  • 将 Preact 添加到你的 Astro 项目
  • 在你的主页上添加 Astro 岛屿(Preact .jsx 组件)
  • 使用 client: 指令使岛屿具有交互性
  1. 如果开发服务器正在运行,请退出它以便访问终端(键盘快捷键:Ctrl + C)。

  2. 用一个命令为你的 Astro 项目添加使用 Preact 组件的能力

    终端窗口
    npx astro add preact
  3. 按照命令行说明确认将 Preact 添加到你的项目中。

这个组件将接收一个问候语数组作为 prop,并随机选择其中一个作为欢迎语显示。用户可以点击一个按钮来获取一个新的随机消息。

  1. src/components/ 目录下创建一个名为 Greeting.jsx 的新文件

    注意 .jsx 文件扩展名。这个文件将用 Preact 编写,而不是 Astro。

  2. 将以下代码添加到 Greeting.jsx

    src/components/Greeting.jsx
    import { useState } from 'preact/hooks';
    export default function Greeting({messages}) {
    const randomMessage = () => messages[(Math.floor(Math.random() * messages.length))];
    const [greeting, setGreeting] = useState(messages[0]);
    return (
    <div>
    <h3>{greeting}! Thank you for visiting!</h3>
    <button onClick={() => setGreeting(randomMessage())}>
    New Greeting
    </button>
    </div>
    );
    }
  3. 在你的主页 index.astro 上导入并使用这个组件。

    src/pages/index.astro
    ---
    import BaseLayout from '../layouts/BaseLayout.astro';
    import Greeting from '../components/Greeting';
    const pageTitle = "Home Page";
    ---
    <BaseLayout pageTitle={pageTitle}>
    <h2>My awesome blog subtitle</h2>
    <Greeting messages={["Hi", "Hello", "Howdy", "Hey there"]} />
    </BaseLayout>

    在浏览器中检查预览:你应该会看到一个随机的问候语,但按钮不会工作!

  4. 添加第二个带有 client:load 指令的 <Greeting /> 组件。

    src/pages/index.astro
    ---
    import BaseLayout from '../layouts/BaseLayout.astro';
    import Greeting from '../components/Greeting';
    const pageTitle = "Home Page";
    ---
    <BaseLayout pageTitle={pageTitle}>
    <h2>My awesome blog subtitle</h2>
    <Greeting messages={["Hi", "Hello", "Howdy", "Hey there"]} />
    <Greeting client:load messages={["Hej", "Hallo", "Hola", "Habari"]} />
    </BaseLayout>
  5. 重新访问你的页面并比较这两个组件。第二个按钮可以工作,因为 client:load 指令告诉 Astro 在页面加载时,在客户端上发送并重新运行其 JavaScript,从而使组件具有交互性。这被称为注水组件。

  6. 一旦清楚地看到了区别,就移除未被注水的 Greeting 组件。

    src/pages/index.astro
    ---
    import BaseLayout from '../layouts/BaseLayout.astro';
    import Greeting from '../components/Greeting';
    const pageTitle = "Home Page";
    ---
    <BaseLayout pageTitle={pageTitle}>
    <h2>My awesome blog subtitle</h2>
    <Greeting messages={["Hi", "Hello", "Howdy", "Hey there"]} />
    <Greeting client:load messages={["Hej", "Hallo", "Hola", "Habari"]} />
    </BaseLayout>

还有其他的 client: 指令可以探索。每个指令在不同的时间将 JavaScript 发送到客户端。例如,client:visible 只会在组件在页面上可见时才发送其 JavaScript。

考虑一个包含以下代码的 Astro 组件

---
import BaseLayout from '../layouts/BaseLayout.astro';
import AstroBanner from '../components/AstroBanner.astro';
import PreactBanner from '../components/PreactBanner';
import SvelteCounter from '../components/SvelteCounter.svelte';
---
<BaseLayout>
<AstroBanner />
<PreactBanner />
<PreactBanner client:load />
<SvelteCounter />
<SvelteCounter client:visible />
</BaseLayout>
  1. 这五个组件中,哪一个会是被注水的岛屿,将 JavaScript 发送到客户端?

  2. 这两个 <PreactBanner /> 组件在哪些方面相同?又在哪些方面不同?

  3. 假设 SvelteCounter 组件显示一个数字并有一个按钮来增加它。如果你看不到网站的代码,只能看到实时发布的页面,你将如何判断这两个 <SvelteCounter /> 组件中哪一个使用了 client:visible

对于以下每个组件,请指出将发送到浏览器的是什么

  1. <ReactCounter client:load />

  2. <SvelteCard />

贡献 社区 赞助