在 Gatsby 中将位置和 pageContext 从页面传递到子组件

jup*_*ror 2 reactjs gatsby

我的盖茨比网站的页面布局如下所示。

const Container = ({location, children, pageContext}) => {
  return (
    <>
      <Header location={location} />
      <Breadcrumbs pageContext={pageContext} />
      {children}
      <Footer />
    </>
  )
}
Run Code Online (Sandbox Code Playgroud)

我需要将locationpageContext从页面传递到子组件。我尝试添加locationpageContextDataProvider这样的:

export const DataContext = React.createContext();

const DataProvider = ({ children, location, pageContext }) => {
  return (
    <DataContext.Provider value={{
      location,
      pageContext
    }}>
      {children}
    </DataContext.Provider>
  )
};

export default DataContext
export { DataProvider }
Run Code Online (Sandbox Code Playgroud)

然后我使用DataProvideringatsby-ssr.jsgatsby-browser.js这样的:

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

在子组件中:

const HeaderLinks = () => {
  return (
    <DataContext.Consumer>
      {
        context => (
          <Menu
            theme="light"
            mode="horizontal"
            selectedKeys={[context.location.pathname]}
          >
            <Menu.Item key={key}>
              <Link to={url}>{name}</Link>
            </Menu.Item>
          </Menu>
        )
      }
    </DataContext.Consumer>
  )
}
Run Code Online (Sandbox Code Playgroud)

但它似乎不起作用,因为当我移动到另一个页面时它没有得到更新。(我也有wrapPageElementContainer可能就是这个原因。)

如何将location和传递pageContext给子组件?使用 React Context 还是简单地将它们作为 props 传递更好?如果我应该使用 React Context,我该如何纠正我的代码以使其正常工作?

Shu*_*tri 5

您可以使用获取页面道具并将其传递给 DataProvider 的位置,而不是使用wrapRootElementto use 。这将确保每个页面上的 pageContext 和位置发生变化ContexProviderwrapPageElement

export const wrapRootElement = ({ element }) => (
  <ThemeProvider theme={theme}>
      {element}
  </ThemeProvider>
);

export const wrapPageElement = ({ element, props }) => (
  <DataProvider value={props}>
      {element}
  </DataProvider>
);
Run Code Online (Sandbox Code Playgroud)
export const DataContext = React.createContext();

const DataProvider = ({ children, value }) => {
  const {location, pageContext} = value;
  return (
    <DataContext.Provider value={{
      location,
      pageContext
    }}>
      {children}
    </DataContext.Provider>
  )
};

export default DataContext
export { DataProvider }
Run Code Online (Sandbox Code Playgroud)

  • 因为假设您想将 pageContext 传递给其他组件并且可能是深层嵌套的组件,所以您必须在每个级别传递此道具 (3认同)