React Switch 总是去第一条路线

Posted

技术标签:

【中文标题】React Switch 总是去第一条路线【英文标题】:React Switch always going to first Route 【发布时间】:2021-04-30 23:00:05 【问题描述】:

如果我点击“/”或“/reset_password”或任何其他路由,PurelyUnauthenticatedRoutes 中的第一个组件总是会被调用,即带有消息 ROUTE_CONSTANTS.RESET_PASSWORD 的 PublicRoute

<Router>
         <Switch>
           <PurelyUnauthenticatedRoutes />
           <PublicRoute key=1 redirect=false path="/" component=CheckAuthenticatedRoutes />
         </Switch>
     </Router>

const PurelyUnauthenticatedRoutes = (props) => 
  return [
    <PublicRoute
      ...props
      key="/reset_password"
      redirect=false
      path="/reset_password"
      render=(routeProps) => <div>ROUTE_CONSTANTS.RESET_PASSWORD</div>
    />,
  ];
;
const PublicRoute = (props) => 

  const  userAuthenticationDetails, redirect  = props;

  const isLoggedIn = (userAuthenticationDetails && userAuthenticationDetails.isLoggedIn) || false;
  if (isLoggedIn && redirect) 
    return <Redirect to="/dashboard" />;
  
  return <Route ...props />;
;

export default PublicRoute;

【问题讨论】:

你应该在路由上使用 exact 属性,否则它只会匹配第一个匹配的:reactrouter.com/web/api/Route/exact-bool @Jayce444 我应该在哪里以及为什么要准确放置。理想情况下,如果我要说“/”,那么它应该转到 CheckAuthenticatedRoutes 组件,但它会转到 PurelyUnauthenticatedRoutes 第一个元素 【参考方案1】:

这是您的PurelyUnauthenticatedRoutes 组件上的return 语句执行此操作。您正在返回一个 PublicRoute 组件数组。 React 不知道如何正确渲染它。相反,您应该将多个路由作为 Switch 组件的子级返回。

Router 中有多个Switch 语句很好。所有Route 组件都必须是Switch 的直接子级(除非您要渲染多个Routes)。

您确实需要弄清楚您的匹配条件,因为Router 顶层的Switch 意味着流量将流向PurelyUnauthenticatedRoutesPublicRoute - 而不是两者。目前所有流量都由PurelyUnauthenticatedRoutes 处理,因此PublicRoute 组件与key=1 永远不会显示。

const PurelyUnauthenticatedRoutes = (props) => 
  return (
    <Switch>
      <PublicRoute
        ...props
        key="/reset_password"
        redirect=false
        path="/reset_password"
        render=(routeProps) => <div>ROUTE_CONSTANTS.RESET_PASSWORD</div>
      />
    </Switch>
  );
;

注意:当您在 App 中使用 props 时,您当前没有使用任何 props 调用它,因此您实际上不需要接受或传递该 props 对象,如果您不这样做想要。

【讨论】:

我尝试在 PurelyUnauthenticatedRoutes 中添加开关,但主父开关仍然总是转到第一条路由,即 PurelyUnauthenticatedRoutes。它不会检查是否没有具有该名称的路由,所以转到下一条路由。此外,如果我通过路径支持 PurelyUnauthenticatedRoutes 它工作正常。但我不能有一系列路径作为 PurelyUnauthenticatedRoutes 的支持。因为它不会是正确的方法

以上是关于React Switch 总是去第一条路线的主要内容,如果未能解决你的问题,请参考以下文章

重定向到 React 中的另一条路线时如何传递状态/道具?

反应路由器 Dom 在巢外的一条路线

在成功的异步 redux 操作上转换到另一条路线

React-Router翻译路线的最佳方式?

Laravel 语言翻译未在第一条路线加载

在 Create React App 中使用 React Router 排除生产路线