在盖茨比中将Context Provider放在哪里?

And*_*ios 5 javascript reactjs axios gatsby react-context

initializeIcons()仅在第一次访问站点时才需要运行一些功能(例如Office UI Fabric React的)和AXIOS调用(例如使用Context API检索登录的用户),然后将检索到的值存储在React Context中并进行它适用于整个应用程序。

Gatsby将我页面的内容包装在Layout中,例如:

const IndexPage = () =>
<Layout>
   Body of Index Page...
</Layout>
Run Code Online (Sandbox Code Playgroud)
const AnotherPage = () =>    
<Layout>
   Body of Another Page...
</Layout>
Run Code Online (Sandbox Code Playgroud)

布局是这样的:

const Layout = ({ children }) =>
<>
    <Header /> 
    <main>{children}</main>
    <Footer />
</>
Run Code Online (Sandbox Code Playgroud)

我知道我可以把我的背景:

我想我需要一个根<app>对象来包围我的Context Provider,但是用盖茨比实现这一目标的一种干净方法是什么?

我应该在哪里放置我的上下文提供程序?

Eli*_*ant 7

您定义一个根布局。与正常布局相比,没有定义“可见”的页面元素,但在每个页面上都需要隐藏的东西,如 ContextProviders、React Helmet、主题等:

RootLayout.jsx

export default function RootLayout({ children }) {
  return (
    <>
      <Helmet />
        <ThemeProvider theme={theme}>
          <CssBaseline />
          <ContextProvider>
            {children}
          </ContextProvider>
        </ThemeProvider>
    </>
  );
}
Run Code Online (Sandbox Code Playgroud)

Gatsby 通过gatsby-browser.js和隐式调用此根布局gatsby-ssr.js并将其应用于您的每个页面。这两行代码是 Gatsby 为您处理其余部分所需的全部内容。

gatsby-browser.js

export const wrapRootElement = ({ element }) => <RootLayout>{element}</RootLayout>;
Run Code Online (Sandbox Code Playgroud)

gatsby-ssr.js

export const wrapRootElement = ({ element }) => <RootLayout>{element}</RootLayout>;
Run Code Online (Sandbox Code Playgroud)

概括:

  • 您将上下文提供程序放在根布局中。

参考:

  • 在这里这里问了相关的问题。我在此答案中提供的代码是您和我的问题的解决方案。如果您的整个应用程序需要此信息,那么从 React Redux 等框架改编而来的良好编码实践是使用 Context Provider 包装您的整个应用程序。
  • 博客文章@Lionel牛逼提及。