【问题标题】:Redirect in react-router-dom V6react-router-dom V6 中的重定向
【发布时间】:2023-03-22 13:47:01
【问题描述】:

我需要在登录后导航回原来请求的 URL。

例如,用户输入www.example.com/settings,因为用户未通过身份验证,它将导航到登录页面www.example.com/login

一旦通过身份验证,它应该会自动导航回www.example.com/settings

我最初使用react-router-dom v5 的方法非常简单:

const PrivateRoute = ({ isLoggedIn, component: Component, ...rest }) => {
  return (
    <Route
      {...rest}
      render={(props) =>
        isLoggedIn? (
          <Component {...props} />
        ) : (
          <Redirect
            to={{ pathname: `/login/${props.location.search}`, state: { from: props.location } }}
          />
        )
      }
    />
  );
};


<PrivateRoute exact isLoggedIn={isLoggedIn} path="/settings" component={Settings} />

谁能告诉我如何在 v6 中做到这一点?提前致谢

【问题讨论】:

  • 一种通用的方法是在路径名中进行查询,例如/login/search?next=/settings
  • 如何记住原来的url?即我怎么知道我需要将settings 附加到网址

标签: javascript reactjs react-router-dom


【解决方案1】:

react-router-dom v6 中渲染路由和处理重定向与在 v5 中完全不同。自定义路由组件已经不复存在,它们被包装组件模式所取代。

v5 - 自定义路线

获取 props 并有条件地渲染一个带有经过的路由 props 的 Route 组件,或者一个带有当前 location 的路由状态的 Redirect 组件。

const CustomRoute = ({ isLoggedIn, ...props }) => {
  const location = useLocation();
  return isLoggedIn? (
    <Route {...props} />
  ) : (
    <Redirect
      to={{
        pathname: `/login/${location.search}`,
        state: { location },
      }}
    />
  );
};

...

<PrivateRoute
  exact
  isLoggedIn={isLoggedIn}
  path="/settings"
  component={Settings}
/>

v6 - 自定义包装器

采用 props 并有条件地为嵌套的 Route 组件渲染一个 Outlet 组件,或者一个 Navigate 组件的路由状态保持当前 location

const CustomWrapper = ({ isLoggedIn, ...props }) => {
  const location = useLocation();
  return isLoggedIn? (
    <Outlet />
  ) : (
    <Navigate
      to={`/login/${location.search}`}
      replace
      state={{ location }}
    />
  )
};

...

<Route path="settings" element={<CustomWrapper isLoggedIn={isLoggedIn} />} >
  <Route path="settings" element={<Settings />} />
</Route>

【讨论】:

  • 使用查询变量的优点是状态将在刷新时保持。尽管如此,您的方法还是不错的。
  • @NjugunaMureithi 我不太赞同您的评论,但这是已建立的 v6 模式。见auth example
  • 附言。你的答案是正确的。让我澄清一下我的问题。我的意思是:如果我在登录页面并从浏览器刷新页面,你的答案会起作用吗? IE。重定向/导航会发生吗?
  • @NjugunaMureithi 这完全取决于呈现在“/login”或任何路径上的组件是否呈现重定向或提供任何其他类型的命令式重定向。通常情况下,登录组件将被放置在一种“反身份验证”路由上,这意味着如果您已经通过身份验证,它会将您重定向出去。如果您在登录页面并刷新了页面,我希望您会留在登录页面上,因为您还没有第一次被退回。
  • @NjugunaMureithi 啊,我明白你现在的意思了......你在问“在登录页面上是否保持路由状态并重新加载页面?”不,默认情况下不是。如果这是一个需要关注的用例,那么登录页面应该缓存重定向引用,以便最终可以重定向回被访问的原始路由。
猜你喜欢
  • 2022-06-24
  • 2022-08-08
  • 1970-01-01
  • 2021-04-05
  • 2021-12-30
  • 2023-01-17
  • 2021-12-20
  • 2022-01-24
相关资源
最近更新 更多