使用可选路径和可选参数react-router 4

IT技术 reactjs react-router
2021-05-11 22:16:35

需要声明一个包含字符串和参数的可选路径
现在我有了这个路径

<Route exact path="/tasks/:id" render={(props) => (
  <AsyncTask {...props} profile={this.state.profile} />
)} />

我需要有

/tasks/:id/notification/:notificationId

哪里notification/:notificationId是可选的
我试图以这种方式添加它,但它不起作用

/tasks/:id/(notification/:notificationId)?

我需要这个来知道我是否来自通知链接,将其标记为已读。

这是工作

/tasks/:id/(notification)?/:notificationId?

但它匹配并且没有路径 notificationId

2个回答

可悲的是,似乎没有办法做到这一点。理想的方法是为您的目的创建两个单独的路线。

<Route exact path="/tasks/:id" component={...} />
<Route exact path="/tasks/:id/notification/:notificationId" component={...} />

如果你真的必须只声明一个路由,你可以使用自定义正则表达式规则(参数名称声明后用括号括起来的部分):

<Route exact path="/tasks/:id/:notificationId(notification/\d+)?" component={...} />

然而!!- 请注意,notificationId参数将包含子字符串"notification"例如,如果您有:

tasks/123/notification/456

您将有一个taskIdof"123"notificationIdof "notification/456"(整个字符串)!

也就是说,上面的路线将匹配以下路径:

  • tasks/123
  • tasks/123/notification/456

但不是:

  • tasks/123/notification
  • tasks/123/notification/abc
  • tasks/123/456

等等...


TL;DR - 您可能想要使用两个单独的路由,如上面的第一个示例所示。

看起来 React Router [ 1 ]对此没有任何支持也许您可以只使用查询参数? /tasks/:id?notification=notificationID.