看起来<Switch>
应该只有<Route>
和<Redirect >
组件作为直接子级。(来源)
我想这就是为什么你的Redirect
,你使用不工作ContextB
的Switch
孩子。
最简单但重复的解决方案可能是将您ContextB
作为<Route>
您想要的每个孩子传递:
注意:这些解决方案假设您像这样分配了 Context 组件的默认值: const MyContext = React.createContext(defaultValue);
<Route exact path='/route2'>
<ContextB.Provider>
<Component1 />
</ContextB.Provider>
</Route>
您甚至可以ContextRoute
为此创建一个组件:
import React from 'react';
import { Route } from 'react-router-dom';
const ContextRoute = ({ contextComponent, component, ...rest }) => {
const { Provider } = contextComponent;
const Component = component;
return (
<Route {...rest}>
<Provider>
<Component />
</Provider>
</Route>
);
};
export default ContextRoute;
然后将其用作路由:
<ContextA>
<Switch>
<Route exact path='/route1' component={ Component1 } />
<ContextRoute exact path='/route2' contextComponent={ContextB} component={ Component2 } />
<ContextRoute exact path='/route3' contextComponent={ContextB} component={ Component3 } />
<Redirect from='/' to='/route1' />
</Switch>
</ContextA>
使用此解决方案,然后您将上下文与嵌套组件中的渲染props一起使用:
return (
<ContextB.Consumer>
{value => <div>{value}</div>}
</ContextB.Consumer>
);
但是我们可以想象更多的解决方案,比如HOC,将上下文值直接传递给路由组件 props 等......