React Router Switch 路由不匹配
React Router Switch routes not being matched
使用 react 16.13.1 和 react-router 5.1.2 处理客户端路由,遇到一些路由问题。
首先,我有一个 Switch
组件和几个子 Route
组件(如下所示),并且一切都按预期进行。与我的任何特定路线都不匹配的路径会落入包罗万象的路线。
<Switch>
<Route exact path="/">
<Home />
</Route>
<Route path="/old-match">
<Redirect to="/will-match" />
</Route>
<Route path="/will-match">
<WillMatch />
</Route>
<Route path="*">
<NoMatch />
</Route>
</Switch>
接下来我想将一些路由设置为 private 这样只有登录的用户才能访问它们。我见过几个自定义 PrivateRoute
组件的例子,但是当我实现它们时,我似乎每次都遇到同样的问题......在私有路由之后定义的任何路由都不会成功匹配。我整理了一个简化版本的代码,它使用 isAuthenticated
内联变量来呈现一些条件组件,如下所示:
const isAuthenticated = true;
<Switch>
<Route exact path="/">
<Home />
</Route>
{isAuthenticated && (
<>
<Route path="/old-match">
<Redirect to="/will-match" />
</Route>
<Route path="/will-match">
<WillMatch />
</Route>
</>
)}
<Route path="*">
<NoMatch />
</Route>
</Switch>
包罗万象的路由永远不会匹配,因为它在私有片段之后。我在这里做错了什么?我在 https://codesandbox.io/s/react-router-test-fzl22 有这个简化示例的沙箱。感谢任何帮助。
React 片段标签破坏了 Switch 语句。如果您将代码重构为:
<Switch>
<Route exact path="/">
<Home />
</Route>
{isAuthenticated && (
<Route path="/old-match">
<Redirect to="/will-match" />
</Route>
)}
{isAuthenticated && (
<Route path="/will-match">
<WillMatch />
</Route>
)}
<Route path="*">
<NoMatch />
</Route>
</Switch>
代码运行良好。
您可以在您的沙箱的一个分支中看到这个工作 here。
尝试使用三元运算符而不是 And 运算
const isAuthenticated = true;
<Switch>
<Route exact path="/">
<Home />
</Route>
{isAuthenticated ? (
<>
<Route path="/old-match">
<Redirect to="/will-match" />
</Route>
<Route path="/will-match">
<WillMatch />
</Route>
</>
:
<Route path="*">
<NoMatch />
</Route>
)
使用 react 16.13.1 和 react-router 5.1.2 处理客户端路由,遇到一些路由问题。
首先,我有一个 Switch
组件和几个子 Route
组件(如下所示),并且一切都按预期进行。与我的任何特定路线都不匹配的路径会落入包罗万象的路线。
<Switch>
<Route exact path="/">
<Home />
</Route>
<Route path="/old-match">
<Redirect to="/will-match" />
</Route>
<Route path="/will-match">
<WillMatch />
</Route>
<Route path="*">
<NoMatch />
</Route>
</Switch>
接下来我想将一些路由设置为 private 这样只有登录的用户才能访问它们。我见过几个自定义 PrivateRoute
组件的例子,但是当我实现它们时,我似乎每次都遇到同样的问题......在私有路由之后定义的任何路由都不会成功匹配。我整理了一个简化版本的代码,它使用 isAuthenticated
内联变量来呈现一些条件组件,如下所示:
const isAuthenticated = true;
<Switch>
<Route exact path="/">
<Home />
</Route>
{isAuthenticated && (
<>
<Route path="/old-match">
<Redirect to="/will-match" />
</Route>
<Route path="/will-match">
<WillMatch />
</Route>
</>
)}
<Route path="*">
<NoMatch />
</Route>
</Switch>
包罗万象的路由永远不会匹配,因为它在私有片段之后。我在这里做错了什么?我在 https://codesandbox.io/s/react-router-test-fzl22 有这个简化示例的沙箱。感谢任何帮助。
React 片段标签破坏了 Switch 语句。如果您将代码重构为:
<Switch>
<Route exact path="/">
<Home />
</Route>
{isAuthenticated && (
<Route path="/old-match">
<Redirect to="/will-match" />
</Route>
)}
{isAuthenticated && (
<Route path="/will-match">
<WillMatch />
</Route>
)}
<Route path="*">
<NoMatch />
</Route>
</Switch>
代码运行良好。
您可以在您的沙箱的一个分支中看到这个工作 here。
尝试使用三元运算符而不是 And 运算
const isAuthenticated = true;
<Switch>
<Route exact path="/">
<Home />
</Route>
{isAuthenticated ? (
<>
<Route path="/old-match">
<Redirect to="/will-match" />
</Route>
<Route path="/will-match">
<WillMatch />
</Route>
</>
:
<Route path="*">
<NoMatch />
</Route>
)