【问题标题】:React Router: wildcard matching matches other routes with query parametersReact Router:通配符匹配匹配其他带有查询参数的路由
【发布时间】:2021-07-19 21:00:49
【问题描述】:

使用 React 路由器 v5。我有一堆像下面这样的路由,最后有一个通配符路径 Route:

<Router>
<Switch>

<Route path="/" exact><Component /></Route>
<Route path="/1" exact><Component1 /></Route>
<Route path="/1/blah" exact><Component2 /></Route>
<Route path="/3" exact><Component3 /></Route>
<Route path="*">
    <Redirect to="/" />
</Route>

</Switch>
</Router>

我正在尝试转到/1?query=123,但随后我被重定向回/。如果我删除通配符 Route,则转到 /1?query=123 会转到其指定的组件。如果路径完全未知,则通配符的意义在于匹配。我该怎么做?

编辑:为了进一步的上下文(从没想过有必要),但我有一个奇怪的文件结构。

它看起来像:文件 1 &lt;BrowserRouter&gt;&lt;AllRoutes /&gt;&lt;/etc.&gt; 然后在文件 2 中:&lt;Switch&gt;&lt;Route /&gt;&lt;Route /&gt;&lt;MoreRoutes&gt;&lt;/Switch&gt; 然后在文件 3 中:&lt;&gt;&lt;Route /&gt;&lt;Route /&gt;&lt;Route path="*" /&gt;&lt;/&gt; 其中文件 3 是上面的代码。

编辑 2:显然在文件 2 中使用 MoreRoutes 做了一些包含内容导致了问题。如何实际包含“MoreRoutes”变量是我还没有弄清楚的事情。因为如果你把重定向通配符路由放在&lt;MoreRoutes /&gt;{MoreRoutes} 之后,通配符就不再匹配了

【问题讨论】:

  • 我无法重现这个,它works fine for me。从更广泛的角度来看,&lt;Route path="*"&gt;Switch 中大部分是多余的,因为如果你到了最后并且没有匹配,那么你就走上了一条未知/意外的道路。我只想摆脱它。
  • @lawrence-witt 感谢您的解释和快速演示!对我来说不幸的是,删除 Switch 仍然不起作用,因为所有内容都立即与通配符匹配。我将使用更多上下文更新问题,但换句话说,我使用了多个文件。所以它看起来像:文件 1 &lt;BrowserRouter&gt;&lt;AllRoutes /&gt;&lt;/etc.&gt; 然后在文件 2 中:&lt;Switch&gt;&lt;Route /&gt;&lt;Route /&gt;&lt;MoreRoutes&gt;&lt;/Switch&gt; 然后在文件 3 中:&lt;&gt;&lt;Route /&gt;&lt;Route /&gt;&lt;Route path="*" /&gt;&lt;/&gt; 其中文件 3 是问题中的代码。
  • 我不是说去掉开关,我的意思是去掉通配符路由,只保留Redirect
  • 我认为您的问题可能与此文件无关,更重要的是整个文件夹结构和导入的路由。 Switch 的所有后代必须是 RouteRedirect。我隐约记得当你导入包裹在另一个组件中的路由时它不会正常工作。
  • 明白了。所以我尝试只使用不带通配符的重定向,结果与初始相同。也许与其将其作为一个组件,不如将其用作一个函数:&lt;Switch&gt;{MoreRoutes()}&lt;/Switch&gt;? MoreRoutes == &lt;&gt;&lt;Route /&gt;etc.&lt;/&gt;?还是应该&lt;&gt;&lt;Route&gt;

标签: reactjs react-router react-router-dom


【解决方案1】:

尝试从路径中删除“精确”。

<Router>
<Switch>

<Route path="/"><Component /></Route>
<Route path="/1"><Component1 /></Route>
<Route path="/2"><Component2 /></Route>
<Route path="/3"><Component3 /></Route>
<Route path="*">
    <Redirect to="/" />
</Route>

</Switch>
</Router>

【讨论】:

  • 同样的结果。我想我还应该注意 /1 和 /2 实际上是 /1/1/blah。问题已更新。
  • 你不能把它作为路径参数包含进来吗?
  • /1/blah 参数?否。与精确一起使用时查询参数不匹配是否有原因?
  • 是的,因为它们是路径的一部分,这意味着它不是完​​全匹配的。
  • 查询参数不是路径的一部分。使其准确/不准确不会有任何效果。
猜你喜欢
  • 2018-09-18
  • 1970-01-01
  • 2017-10-03
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 1970-01-01
  • 2015-11-07
相关资源
最近更新 更多