代码之家  ›  专栏  ›  技术社区  ›  Antuan

无法访问路径参数

  •  1
  • Antuan  · 技术社区  · 7 年前

    <BrowserRouter>
       <Sidebar>
       <Switch>
           <Route path='room/:roomId' component={RoomComponent}/>
       </Switch>
    </BrowserRouter>
    

        location:
           hash: ""
           key: "6qujt0"
           pathname: "/room/asdf3/"
           search: ""
           state: undefined
    
        match:
           isExact: false
           params:{}
           path: "/"
           url: "/"
    

    你知道会发生什么吗?提前谢谢你!

    3 回复  |  直到 7 年前
        1
  •  1
  •   zhuber    7 年前

    您只能在 Route component 以及它的后代(如果包裹着 withRouter

    你能做的就是使用相同的匹配代码 路线 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"
    //  } 
    
        2
  •  1
  •   Ujjawal Raj    7 年前

    您可以定义状态变量 roomId 在你的 RoomComponent 喜欢

    constructor(props){
    super(props);
    
     this.state = {
        roomid: this.props.params.match.roomId
        }
    }
    

    SidebarComponent

    <SidebarComponent
       roomId = this.state.roomid
    />
    
        3
  •  1
  •   Yilmaz    7 年前

    react路由器dom正在传递这些属性:历史、位置、匹配。

    react router只会将这些道具传递给路由中实际使用的组件。这就是为什么RoomComponent可以访问这些道具,但是侧边栏组件不能访问,因为侧边栏没有设置为路由的组件值。

        4
  •  0
  •   joseluismurillorios    7 年前

    可能侧栏组件没有 withRouter ,但您可以更好地使用函数或库来解析url查询,我总是使用查询字符串的parse函数,下面是一个示例:

    import * as qs from 'query-string';
    
    const { search } = history.location;
    const query = qs.parse(search, { ignoreQueryPrefix: true });
    console.log(query.roomId);
    
        5
  •  0
  •   Eric Tan    7 年前

    这是因为侧边栏不是room组件的子级,它位于路由器的外部,它只会获得最接近匹配的根路径。

    match 对象,并使其通过状态。