【发布时间】:2020-09-15 08:09:17
【问题描述】:
我的 Gatsby 网站页面布局如下所示。
const Container = ({location, children, pageContext}) => {
return (
<>
<Header location={location} />
<Breadcrumbs pageContext={pageContext} />
{children}
<Footer />
</>
)
}
我需要将页面中的location 和pageContext 传递给子组件。我尝试将location 和pageContext 添加到DataProvider,如下所示:
export const DataContext = React.createContext();
const DataProvider = ({ children, location, pageContext }) => {
return (
<DataContext.Provider value={{
location,
pageContext
}}>
{children}
</DataContext.Provider>
)
};
export default DataContext
export { DataProvider }
然后我在gatsby-ssr.js 和gatsby-browser.js 中使用DataProvider,如下所示:
export const wrapRootElement = ({ element }) => (
<ThemeProvider theme={theme}>
<DataProvider>
{element}
</DataProvider>
</ThemeProvider>
);
在子组件中:
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>
)
}
但它似乎不起作用,因为当我移动到另一个页面时它没有得到更新。 (我也有wrapPageElement 和Container,可能就是这个原因。)
如何将location 和pageContext 传递给子组件?使用 React Context 还是简单地将它们作为道具传递更好?如果我应该使用 React Context,我该如何更正我的代码以使其正常工作?
【问题讨论】:
-
第二种情况如何使用dataprovider
-
我只会将它们作为道具传递 TBH。为什么在这里需要上下文?见Before You use context
-
@ShubhamKhatri 我已经更新了我的问题并添加了代码stackoverflow.com/posts/62057441/revisions
-
@RobinMétral 这是一个简化的示例。我的
Header有HeaderLinks,实际上需要使用location。所以我最终将相同的道具从一个组件传递到另一个组件。 -
@jupiteror 就个人而言,我仍然会使用道具(这是我对“使用 React Context 还是简单地将它们作为道具传递更好?”的看法)。你说的很简单,2-3 层的嵌套对于道具来说是很好的。上下文使您的实现更加复杂,除非您需要传递主题或复杂状态,否则我会保持简单。