我有以下内容:
<BrowserRouter>
<Sidebar>
<Switch>
<Route path='room/:roomId' component={RoomComponent}/>
</Switch>
</BrowserRouter>
如果我console.log(this.props),现在在房间组件内部。我可以访问roomId参数。但是,在补充工具栏组件中,我无权访问roomId参数。如果我使用console.log(this.props),则我的位置和匹配道具如下所示:
location:
hash: ""
key: "6qujt0"
pathname: "/room/asdf3/"
search: ""
state: undefined
match:
isExact: false
params:{}
path: "/"
url: "/"
您有什么想法,会发生什么?预先谢谢你!
答案 0 :(得分:0)
可能侧边栏组件没有history
,但是您可以更好地使用函数或库来解析url查询,我一直使用查询字符串的parse函数,这是一个示例:
withRouter
答案 1 :(得分:0)
您可以像
一样在roomId
中定义状态变量RoomComponent
constructor(props){
super(props);
this.state = {
roomid: this.props.params.match.roomId
}
}
,现在将此值作为道具传递给您的SidebarComponent
,以便它可以访问此值。
<SidebarComponent
roomId = this.state.roomid
/>
答案 2 :(得分:0)
这是因为补充工具栏不是房间组件的子元素,它位于路由器外部,因此只会将根路径作为最接近的匹配项。
一种解决方案是将match
对象保存到redux存储并通过状态获取它。
答案 3 :(得分:0)
您只能在Route
component
及其后续子项(如果用withRouter
包裹)中访问该信息。
您可以做的是使用Route
与matchPath所使用的相同的匹配代码:
// inside your Sidebar component
import { matchPath } from "react-router";
const match = matchPath(this.props.location.pathname, {
path: "/room/:roomId",
exact: false,
strict: false
});
// match should be:
// {
// isExact: false
// params: {
// roomId: "asdf3"
// }
// path: "/room/:roomId"
// url: "/room/asdf3"
// }
答案 4 :(得分:0)
react-router-dom正在传递那些道具:历史,位置,比赛。
react-router只会将这些道具传递给Route内部实际使用的组件。这就是为什么RoomComponent可以访问那些道具,但是Sidebar组件无法访问的原因,因为Sidebar并未设置为Route的组件值。