带有 Gatsby 的 Redux - 无法识别包装的提供程序

Redux with Gatsby - wrapped Provider is not recognized

我一直遇到错误

could not find react-redux context value; please ensure the component is wrapped in a <Provider>

即使我已经将根文件包装在 <Provider> 中。我怀疑可能有什么问题是,嵌套组件不是包裹在 <Provider> 中,而是包裹页面的“Link”?

我的 index.tsx 文件看起来像这样

<Provider store={reduxStore}>
   <Layout>
     <title>Home</title>
      <div>
       <Image
         width="100%"
         src="./app-promo1.png"
         alt="app promo banner 1"
       />
       <Image
         width="100%"
         src="./app-promo2.png"
         alt="app promo banner 2"
       />
      </div>
   </Layout>
</Provider>

我的导航栏位于 Layout 组件内的 Header 组件内。

Layout.tsx

<div>
  <LayoutWrapper>
     <HeaderWrapper>
       <div className="d-none d-md-block">
         <Header />
        </div>
        <div className="d-block d-md-none">
          <MobileHeader />
        </div>
     </HeaderWrapper>
     <ContentWrapper>{children}</ContentWrapper>
     <FooterWrapper>
       <Footer />
     </FooterWrapper>
  </LayoutWrapper>
</div>

Header.tsx

<Wrapper>
   <Container>
     <NavWrapper>
        <Logo>
         <AniLink paintDrip hex="#24B2D8" to="/">
           <Image src={logoImg} width="220px" alt="Logo" />
         </AniLink>
        </Logo>
        <div className="d-flex flex-row justify-content-center align-items-center">
         <AniLink paintDrip to="/shop" hex="#24B2D8">
            <NavItem>Shop</NavItem>
          </AniLink>
         <AniLink paintDrip to="/activation" hex="#24B2D8">
            <NavItem>Activation</NavItem>
          </AniLink>
         <AniLink cover to="/partners" bg="#24B2D8">
           <NavItem>Partners</NavItem>
         </AniLink>
         <AniLink cover to="/support" bg="#24B2D8">
            <NavItem>Support</NavItem>
          </AniLink>
        </div>
        <Button
          link="/"
          text="Log in"
          color="blue"
        />
     </NavWrapper>
   </Container>
</Wrapper>

我需要 Redux/Provider 的页面都是这些链接。即:/shop、/activation、/partner 和 /support。但是当我从 / 导航到 /shop 时,它给了我错误。

需要注意的一件事是我使用的是 Gatsby 而不是 create-react-app。我不确定我是否需要在 Gatsby 上做一些特别的事情。

您的提供商需要将您的组件包装在您的应用程序中,这就是为什么当您更改页面时上下文会丢失。要在 Gatsby 中实现这一点,您可以使用双 (gatsby-browser.js/gatsby-ssr.js) wrappRootElement API:

const React = require("react")
const { Provider } = require("react-redux")

const createStore = require("./src/state/createStore")
const store = createStore()

exports.wrapRootElement = ({ element }) => {
  return (
    <Provider store={store}>
      {element}
    </Provider>
  )
}

element 代表 Gatsby 构建的根 React 元素。