【发布时间】: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 <BrowserRouter><AllRoutes /></etc.> 然后在文件 2 中:<Switch><Route /><Route /><MoreRoutes></Switch> 然后在文件 3 中:<><Route /><Route /><Route path="*" /></> 其中文件 3 是上面的代码。
编辑 2:显然在文件 2 中使用 MoreRoutes 做了一些包含内容导致了问题。如何实际包含“MoreRoutes”变量是我还没有弄清楚的事情。因为如果你把重定向通配符路由放在<MoreRoutes /> 或{MoreRoutes} 之后,通配符就不再匹配了
【问题讨论】:
-
我无法重现这个,它works fine for me。从更广泛的角度来看,
<Route path="*">在Switch中大部分是多余的,因为如果你到了最后并且没有匹配,那么你就走上了一条未知/意外的道路。我只想摆脱它。 -
@lawrence-witt 感谢您的解释和快速演示!对我来说不幸的是,删除 Switch 仍然不起作用,因为所有内容都立即与通配符匹配。我将使用更多上下文更新问题,但换句话说,我使用了多个文件。所以它看起来像:文件 1
<BrowserRouter><AllRoutes /></etc.>然后在文件 2 中:<Switch><Route /><Route /><MoreRoutes></Switch>然后在文件 3 中:<><Route /><Route /><Route path="*" /></>其中文件 3 是问题中的代码。 -
我不是说去掉开关,我的意思是去掉通配符路由,只保留
Redirect。 -
我认为您的问题可能与此文件无关,更重要的是整个文件夹结构和导入的路由。
Switch的所有后代必须是Route或Redirect。我隐约记得当你导入包裹在另一个组件中的路由时它不会正常工作。 -
明白了。所以我尝试只使用不带通配符的重定向,结果与初始相同。也许与其将其作为一个组件,不如将其用作一个函数:
<Switch>{MoreRoutes()}</Switch>? MoreRoutes ==<><Route />etc.</>?还是应该<>是<Route>?
标签: reactjs react-router react-router-dom