如何仅在 react-router-dom 中通过带有 slug 的路由访问不同的组件?

Posted

技术标签:

【中文标题】如何仅在 react-router-dom 中通过带有 slug 的路由访问不同的组件?【英文标题】:How to access different components by routes with slug only in react-router-dom? 【发布时间】:2018-05-04 08:39:15 【问题描述】:

假设我们有两个用于 Post 和 Project 的组件。每个帖子和项目都有 slug。我想通过 slug 访问帖子和项目。所以我们有路线:

<Route path="/:post_slug" component=PostComponent />
<Route path="/:project_slug" component=ProjectComponent />

例如,当您访问某个 post pr 项目时,会调用一个操作以通过参数获取其数据。像这样的:

this.props.fetchPost(this.props.match.params.post_slug)
this.props.fetchProject(this.props.match.params.project_slug)

如果我只做一个只能被 slug 访问的组件,那么它就可以工作。但是如果我想通过 slug 访问两个不同的组件,那就搞砸了。即当我访问帖子时,反应认为我正在访问项目。

也许有一些方法可以在 react-router-dom 中处理这种情况?

【问题讨论】:

【参考方案1】:

如果您将检测逻辑放在另一个组件中,您可以这样做,如下所示:

<Route path="/:any_slug" component=AnyComponent />

然后让该组件找出您拥有的 ID 类型并相应地呈现所需的子组件:

const AnyComponent = props => 
    if (slugIsProject(props.match.params.any_slug)) 
        return <ProjectComponent id=props.match.params.any_slug />;
     else 
        return <PostComponent id=props.match.params.any_slug />;
    

这样,路由器总是呈现相同的组件 (AnyComponent),但该组件的外观会有所不同,具体取决于确定的 ID。

【讨论】:

【参考方案2】:

没有办法做到这一点,因为路由器无法区分这两条路由。例如,如果我要导航到site.com/my_slug,路由器将不知道my_slug 应该是:post_slug 还是:project_slug。当它们都存在时,它会将您发送到一个项目,因为它将它们解释为相同的路线,因此它使用您定义的最后一个。

您可以尝试的另一种方法是让您的路线更加明确,如下所示:

<Route path="/post/:post_slug"       component=PostComponent />
<Route path="/project/:project_slug" component=ProjectComponent />

【讨论】:

非常感谢您的回答。是的,我同意更明确的路线。但仍在努力使其发挥作用。如果我用withRouter 包装我的根组件,那么我会在this.props.match 中获得有关我的参数的信息。我会尝试制作某种处理程序来检查通过了什么 slug。 @Dair,如果它回答了你的问题,你应该接受它。

以上是关于如何仅在 react-router-dom 中通过带有 slug 的路由访问不同的组件?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中通过嵌套的 Json/dict 解析

在android中通过服务实现sip

如何防止某人被在某些情况下从react-router-dom重定向

如何在 Solidity 中通过多个属性查询结构?

如何在java中通过SFTP传输文件? [复制]

如何在 C# 中通过指纹查找证书