发布于 2026-01-06 6 阅读
0

亲爱的,我已经检查过孩子们的类型了!快来找出你的bug!属性类型实战!孩子们是从哪里来的?!让我们验证一下!不要止步于样板代码!就这样!

亲爱的,我检查了孩子们

抓住你的虫子!

PropTypes 的实际应用

这些孩子是从哪里来的?!

让我们验证一下!

不要止步于模板

就这样!

请跟随我一起继续探索如何解释和理解样板代码!

今天我们将深入探讨 React 中的 PropTypes。实际上,促使我做这件事的原因是,在使用gatsby new <project-name>命令时会显示一些模板代码。

首先映入眼帘的是出现在以下位置的一段代码片段layout.js

Layout.propTypes = {
  children: PropTypes.node.isRequired,
}
Enter fullscreen mode Exit fullscreen mode

这段代码的有趣之处在于,严格来说,真正执行操作的并非 Gatsby 本身,而是 React 代码(Gatsby 本身就是基于 React 构建的),但它是 Gatsby CLI 入门项目默认包含的代码。

抓住你的虫子!

Proptypes是 React 中的一项功能,可以帮助验证通过 props 传递的值。

如果你对道具不太熟悉,这篇文章里有一些概述。


PropTypes 的理念在于它可以捕获组件间传递的数据类型不匹配的问题。例如,如果传入msg的是一个 `String` 类型的值,但目标组件期望的是一个 `String` 类型的值。即使没有 TypeScript 或其他支持类型检查的 JavaScript 扩展,React 也提供了 PropTypes 作为内置的类型检查机制。Stringnumber

PropTypes 的实际应用

PropTypes 在两个层面上发挥作用。它确保将正确的数据类型传递给特定组件。它还会检查组件是否接收到正确的数据类型。

这篇文章或许能帮助你理解组件的概念。

以我们最初使用的代码为例,它正在为Layout组件设置 PropTypes。也就是说,它正在定义传递给组件的 props 的验证Layout

Layout.propTypes = {
     ...stuff goes here...
}
Enter fullscreen mode Exit fullscreen mode

这些孩子是从哪里来的?!

这是Layout初始项目自带的组件。请注意传递给该组件的 props。它传递了一个名为 `<prop>` 的 prop children,并在渲染函数的主体中引用了它。

const Layout = ({ children }) => (
    render={data => (
      <>
        <Header siteTitle={data.site.siteMetadata.title} />
          <main>{children}</main>
          <footer/>
        </div>
      </>
    )}
)
Enter fullscreen mode Exit fullscreen mode

现在我们来看一个组件本身的使用示例。我们可以在初始项目生成的组件Layout中找到这样的例子。NotFoundPage

const NotFoundPage = () => (
  <Layout>
    <SEO title="404: Not found" />
    <h1>NOT FOUND</h1>
    <p>You just hit a route that doesn&#39;t exist... the sadness.</p>
  </Layout>
)
Enter fullscreen mode Exit fullscreen mode

嗯,这有点奇怪。乍一看,它Layout似乎完全没有使用 props。通常情况下,props 是以键值对的形式传递的,出现在组件的起始标签中。类似这样。

<Example msg="test" />
Enter fullscreen mode Exit fullscreen mode

然后Example我们在组件内部传入 props 并访问msg内容。但Layout它并没有这样做。

事实证明,Layout它仍然在使用 props,只是方式不同。children实际上是一个特殊的内置 prop,它指的是标签内的Layout所有内容。

  <Layout>
//ALL OF THIS
    <SEO title="404: Not found" />
    <h1>NOT FOUND</h1>
    <p>You just hit a route that doesn't exist... the sadness.</p>
//TO THIS
  </Layout>
)
Enter fullscreen mode Exit fullscreen mode

布局开始标签和结束标签之间的所有内容都被视为属性children

让我们验证一下!

现在我们回到PropTypes验证。既然我们知道了childrenprop是什么,就可以开始理解我们是如何验证该内容的了。

Layout.propTypes = {
  children: PropTypes.node.isRequired,
}
Enter fullscreen mode Exit fullscreen mode

我们可以用 ` Layout<div>` 来包裹任何东西,但我们唯一关心的是它是否包裹了什么。我们不能渲染一个完全没有信息的页面,或者至少我们不想这样做。我们追求的不是一个空的布局。这就是我们使用 `<div>` 的原因isRequired

我们还想对这个“东西”究竟是什么给出一个比较模糊的定义。node关键词的意思很简单:我传入了一个可渲染的东西。不管它是什么。

不要止步于模板

请注意,模板的这一部分随时可以修改。在定义 Gatsby 应用程序时,您可能需要强制执行不同的标准。例如,您可以像这样限制该属性只能有一个父元素。

Layout.propTypes = {
  children: PropTypes.element.isRequired
};
Enter fullscreen mode Exit fullscreen mode

Gatsby 以此为起点,提示您使用类型强制,并向您展示类型强制的功能。

就这样!

现在我们明白了这段 PropTypes 代码片段是如何对Layout组件进行类型检查的。此外,我们也对内置children属性的使用更加得心应手了。

和以往一样,我们经常会在框架和项目中看到一些看似无关紧要的代码行,却懒得花时间去理解它们。我鼓励你带着好奇心去探索你所看到的每一件事!这会让你成为一名更优秀的程序员。

敬请期待更多样板基础知识!

文章来源:https://dev.to/laurieontech/honey-i-type-checked-the-children-5ad3