我正在使用React路由器开发React Web应用程序。
在主包装器组件上定义的Route对象工作正常,但如果我尝试在子组件上定义Route,则指向该子组件的任何链接都将无法呈现所需的组件。
下面是一个代码片段,试图解释这种情况:
class MainWrapper extends Component {
render() {
return (
<div className="App">
<Switch>
<Route exact path="/a" component= {A}/>
</Switch>
</div>
);
}
}
const A = () => {
return (
<div>
<Route exact path="/b" component={B}/>
<Link to="/b"/>
</div>
)
}
const B = () => {
return (<div>HELLO</div>)
}
在我的应用程序中,指向“ / b”的链接未呈现B组件,就像未传递组件prop一样
为什么这行不通?
答案 0 :(得分:1)
您在两个路径中都指定了“精确路径”,因此要渲染B,您的路径应恰好是“ / b”,但是当链接到“ / b”组件A时,将卸载,因为对于渲染A,您必须位于精确路径上“/一种”。您应该改变方法。一个可能是删除“精确”并在链接中包含“ / a”:
class MainWrapper extends Component {
render() {
return (
<div className="App">
<Switch>
<Route path="/a" component= {A}/>
</Switch>
</div>
);
}
}
const A = () => {
return (
<div>
<Route path="/b" component={B}/>
<Link to="/a/b"/>
</div>
)
}
const B = () => {
return (<div>HELLO</div>)
}
答案 1 :(得分:1)
如果B是A的子代,则url应该是/a/b
而不是/b
,因此您只需要使用此代码更新A
组件
const A = ({match}) => {
return (
<div>
<Route exact path={`${match.url}/b`} component={B}/>
<Link to=to={`${match.url}/b`}/>
</div>
)
};
请参阅文档here
答案 2 :(得分:0)
您在某处有Router
吗?另外,您还没有关闭Link
标签。
答案 3 :(得分:0)
您需要将其包装在Switch
中,并且应该从exact
路线中移除/b
道具。
const A = ({match}) => {
return (
<div>
<Switch>
<Route path={`${match.url}/b`} component={B}/>
</Switch>
<Link to="a/b"/>
</div>
)
}