gatsbyjs、reactjs - 为什么组件渲染两次而图像不出现?

IT技术 reactjs gatsby
2021-04-28 21:13:28

我是gatsbyjsv2 的新手并正在使用它。我有 3 个组件 - 加载器、标题和布局。

layout.js

import React from "react"
import Helmet from 'react-helmet'
import { StaticQuery, graphql } from 'gatsby'
import Header from "./header"
import Loader from "./loader"
import 'bootstrap/dist/css/bootstrap.min.css'
import "./layout.module.css"

const Layout = ({ children }) => (
    <StaticQuery
      query={graphql`
        query SiteTitleQuery {
          site {
            siteMetadata {
              title
              menuLinks {
                name
                link
              }
            }
          }
        }
      `}
      render={data => (
        <React.Fragment>
          <Helmet
            title={'tite'}
            meta={[
              { name: 'description', content: 'Sample' },
              { name: 'keywords', content: 'sample, something' },
            ]}
          >
          </Helmet>
          <Loader />
          <Header menuLinks={data.site.siteMetadata.menuLinks} siteTitle={data.site.siteMetadata.title} />
            <div>{children}</div>
        </React.Fragment>
      )}
    />
  )

  export default Layout

index.js

import React from 'react'
import Layout from "../components/layout"

export default () => (
  <Layout> 
  </Layout>
)

如屏幕截图所示,每个组件都被渲染两次。

在此处输入图片说明

我在图像方面面临的另一个问题。所有图像都在src/images/,当我在header组件中如下使用它时

import React from "react"
import { Link } from 'gatsby'
import styles from "./layout.module.css"

const logo = 'src/images/logo.png';

const Header = ({ siteTitle, menuLinks }) => (
  <header className={styles.header_area}>
    <nav className={`${styles.navbar} navbar-expand-lg ${styles.menu_one} ${styles.menu_four}`}>
        <div className="container">
            <a className="navbar-brand sticky_logo" href="#">
                <img src={logo}  alt="logo" />

图像未显示在页面上。我在 chrome 开发人员工具中检查了 Source,发现图像没有通过webpack.

那么,为什么组件渲染两次,为什么图像不显示?我在这里错过了什么或在做什么?

2个回答

我在使用gatsby-plugin-layout插件时遇到了同样的问题文档不是很清楚,但是当使用 gatsby-plugin-layout 插件时,您不需要在Layout组件之间包装页面该插件会自动处理此问题。如果您在Layout组件之间显式地包装 JSX ,则将Layout呈现两次。

我不确定为什么您的页面正在加载双组件,您是直接访问该站点还是从其他路径访问?


对于您的图像没有显示,这就是原因:您src文件夹中的所有内容都是动态的,这意味着它不会直接提供。如果你想静态包含​​图片,你可以public在你的根目录中创建一个文件夹(与src文件夹同级),并将图片放入其中。public文件夹中的任何内容都将直接提供。例如,您可以使用以下结构:

 |-- src
 `-- public
       `-- images
            `-- logo.png

然后在你的代码中,你可以包含这样的路径

<img src="/images/logo.png"  alt="logo" />

我认为对于像您的用例这样的徽标,这种方法就足够了。然而,如果你总是像这样链接图像,你会错过很多 gatsby 的酷功能。例如,gatsby 可以延迟加载您的图像,或者优化文件大小!您可以在此处了解更多信息(gatsby 官方博客)