09. 构建React应用:创建更多组件

在上一节中我们已经了解了JSX的基础知识,现在是时候进一步深入,创建更多组件来构建我们的应用程序了。通过不断的学习不断的吸收新知识,我们将构建如下最终应用效果⬇️

我们的应用由三个主要部分组成:

  • 顶部的标题栏,显示披萨店的名称
  • 中间的菜单区域,展示六种不同的披萨
  • 底部的页脚,告知用户餐厅当前开放状态,以及一个按钮(目前只是装饰性的)

菜单部分是应用的核心,我们会展示六种不同的披萨。注意到我们已经在第7篇文章里已经创建了披萨组件,在最终效果里这个组件将被重复使用六次来展示不同的披萨信息。

下面是之前第七篇文章里写好的代码结构⬇️,我们将继续这个代码不断布局组件

import React from "react";
import ReactDOM from "react-dom/client";
  

function App() {
    return (
      <div>
        <h1>Fast React Pizza Co.</h1>
        <Pizza />
        <Pizza />
        <Pizza />
      </div>
    );
  }

function Pizza(){
    return <div>
        <img src="pizzas/spinaci.jpg"></img>
        <h2>Pizza Spinaci</h2>
        <p>Tomato, mozarella, spinach, and ricotta cheese</p>
    </div>
}

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
    <React.StrictMode>
        <App />
    </React.StrictMode>
);

1. 创建Header组件

function Header() {
  return <h1>Fast React Pizza Company</h1>;
}

现在我们可以在App组件中使用这个Header组件,替换原来的h1元素。

JSX的美妙之处在于,我们可以像使用普通HTML元素一样使用我们的自定义组件。

2. 创建Footer组件

function Footer() {
  return (
    <footer>
      We're currently open {new Date().toLocaleTimeString()}
    </footer>
  );
}

注意我们如何在JSX中嵌入JavaScript表达式,显示当前时间。这正是JSX强大之处——能够将JavaScript与HTML无缝结合。

  1. 创建Menu组件

最后,让我们创建Menu组件来容纳所有的披萨:将App里面所有的<Pizza />放到Menu组件里⬇️

function Menu() {
  return (
    <div>
      <h2>Our Menu</h2>
      <Pizza />
      <Pizza />
      <Pizza />
      {/* 更多Pizza组件... */}
    </div>
  );
}

记住,JSX只允许有一个根元素,所以我们需要用一个div包裹所有内容。

组件嵌套与组合

现在我们的应用结构更加清晰和有组织性:⬇️

import React from "react";
import ReactDOM from "react-dom/client";
  

function App() {
  return (
    <div>
      <Header />
      <Menu />
      <Footer />
    </div>
  );
}

function Header(){
  return <h1>Fast React Pizza Co.</h1>
}

function Menu() {
  return (
    <div>
      <h2>Our Menu</h2>
      <Pizza />
      <Pizza />
      <Pizza />
      {/* 更多Pizza组件... */}
    </div>
  );
}

function Footer(){
  return <footer>{new Date().toLocaleDateString()}. We're currently open.</footer>
}

function Pizza(){
    return <div>
        <img src="pizzas/spinaci.jpg"></img>
        <h2>Pizza Spinaci</h2>
        <p>Tomato, mozarella, spinach, and ricotta cheese</p>
    </div>
}

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
    <React.StrictMode>
        <App />
    </React.StrictMode>
);
  • App组件是最外层的容器
  • 在App内部,我们嵌套了Header、Menu和Footer组件
  • 在Menu组件内,我们又嵌套了多个Pizza组件

这正是React的核心理念——通过将小组件组合成更大的组件,最终构建出复杂的用户界面。小的Pizza组件组合成Menu组件,Menu再与Header和Footer组件共同组成完整的App组件。

渲染到DOM的过程

值得注意的是,当React将所有内容渲染到DOM时,实际的HTML中不会包含我们的组件名称。浏览器只能看到最终渲染出的HTML元素,如h1、div和footer等,而不知道这些元素来自于哪些React组件。

这种组件化的开发方式不仅使代码更加模块化和可维护,还能让我们更高效地复用UI元素,真正体现了”构建一次,使用多次”的理念。

函数组件的不同写法

最后补充一点,我们可以用多种方式定义React组件函数,除了上面使用的传统function声明外,还可以使用函数表达式或箭头函数:

// 函数表达式
const Test = function() {
  return <div>测试组件</div>;
};

// 箭头函数
const Test = () => {
  return <div>测试组件</div>;
};

选择哪种写法主要取决于个人偏好,我个人更喜欢使用传统的function关键字声明组件。 通过这种组件化的方式构建应用,我们不仅代码结构更清晰,也为未来的扩展和维护打下了坚实的基础。


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注