【问题标题】:React: How to get variable from URL?React:如何从 URL 获取变量?
【发布时间】:2023-03-15 07:03:01
【问题描述】:

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

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

我的路线

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

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>

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

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

【问题讨论】:

    标签: javascript reactjs url routing


    【解决方案1】:

    match

    通过render 属性渲染的组件也会被传递一些路由属性,具体来说,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 也可以通过props 中的传播在组件Workspace 中访问。如果Workspace是一个函数组件,那么react-router-dom也有一个useParams钩子。

    【讨论】:

    • 感谢您的回复。听起来方向正确,但这是在我的 App.js 组件中,使用this.props.match.params.slug 会出现错误TypeError: Cannot read property 'params' of undefined
    • 我可能缺少导入语句吗?
    • @Brack 不,这些是route props,任何Route 传递给render 属性呈现的任何东西。介意分享一下Router 代码在App.js 中的样子吗?
    • 呃,对不起,我猜我以为你在使用 react-router-dom。你用的是什么导航?
    • 我更新了路由器部分以包含我的所有路由代码。我正在使用 react-router-dom import {Route, Switch} from "react-router-dom"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2016-04-25
    • 2011-02-13
    • 2019-05-21
    • 2016-08-03
    • 2014-02-02
    相关资源
    最近更新 更多