首页 > 解决方案 > React:如何从 URL 获取变量?

问题描述

我正在构建一个需要根据 URL 中提供的 slug 从数据库加载“工作区”的应用程序。我的 URL 结构是/app/<workspace slug>/<workspace view>. 目前每个工作区有 3 个视图:地图、列表和设置。我需要<workspace slug>从 URL 中获取值,以便从数据库中加载正确的工作区。如果找不到工作区,我还需要返回错误。

我对 React 很陌生,所以我目前可能没有遵循最佳实践。

我的路由

目前,我通过遍历每个工作区并为以下 3 个视图中的每一个创建一个路由来路由到每个工作区视图App.js

renderContent() {
    return (
        <Switch>
            <Route path="/" component={NetworkMap} exact />
              {this.state.workspaces.map(function(workspace, index){ // Map View Routes
                return (
                  <Route path={"/app/" + workspace.slug + "/map"} render={(props) => <Workspace {...props} workspace={workspace} component={Map} />} />
                );
              })}
              {this.state.workspaces.map(function(workspace, index){ // List View Routes
                return (
                  <Route path={"/app/" + workspace.slug + "/list"} render={(props) => <Workspace {...props} workspace={workspace} component={List} />} />
                );
              })}
              {this.state.workspaces.map(function(workspace, index){ // Settings View Routes
                return (
                  <Route path={"/app/" + workspace.slug + "/settings"} render={(props) => <Workspace {...props} workspace={workspace} component={WorkspaceSettings} />} />
                );
              })}
            <Route component={Error} />
        </Switch>
    );
}

我的链接

{props.workspaces.map(function(workspace, index){
  return (<Link key={index} to={"/app/" + workspace.slug + "/map"} className="dropdown-item cursor-pointer">{workspace.name}</Link>);
})}

我的 Index.js

<BrowserRouter>
    <App />
</BrowserRouter>

我尝试更改workspace.slug:slugRoute 的路径,我认为应该让它出现在道具中,但我似乎无法让它正常工作:

{this.state.workspaces.map(function(workspace, index){
  return (
    <Route path={"/app/:slug/map"} render={(props) => <Workspace {...props} workspace={workspace} component={Map} />} />
  );
})}

标签: javascriptreactjsurlrouting

解决方案


匹配

通过 prop 渲染的组件render也会传递一些 route props,具体来说,match就是你想要的。从那里props.match.params.slug将有你想要的 slug 值

{this.state.workspaces.map(function(workspace, index){
  return (
    <Route
      path="/app/:slug/map"
      render={props => (
        <Workspace
          {...props}
          workspace={workspace}
          component={Map}
          slug={props.match.params.slug}
        />
      )}
    />
  );
})}

match也可以Workspace通过在props. 如果Workspace是功能组件,react-router-dom 也有一个useParams钩子。


推荐阅读