简体   繁体   English

React 路由器 v6,作为 Route 元素传递的 JSX 组件未被触发

[英]React router v6, JSX component passed as Route element is not triggered

I'm trying to set a persistentLogin component that verifies is the user still has a valid refresh token and if so, send a new access token.我正在尝试设置一个 persistentLogin 组件来验证用户是否仍然具有有效的刷新令牌,如果是,则发送一个新的访问令牌。

Here is the code in the router:这是路由器中的代码:

const Routes = () => {
   const { user } = useAuth();

   return (
      <Router>
         <Route index element={<Home />} />
         <Route path='auth-form' element={<AuthForm />}>
            <Route path='register' element={<Register />} />
            <Route path='login' element={<Login />} />
         </Route>
------->>> Here is the component
         <Route element={<PersistLogin />}>
            {user && (
               <>
                  {user.isDev ? (
                     <>
                        {DEV_NAVIGATION.map((nav) => (
                           <Route key={nav.path} path={`${nav.path}`} element={nav.component} />
                        ))}
                     </>
                  ) : (
                     <>
                        {RECRUITER_NAVIGATION.map((nav) => (
                           <Route key={nav.path} path={`${nav.path}`} element={nav.component} />
                        ))}
                        <Route path='/*' element={<Navigate to='/' replace={true} />} />
                     </>
                  )}
               </>
            )}
         </Route>
         <Route path='/*' element={<Navigate to='/' replace={true} />} />
      </Router>
   );
};

And here is the code in PersistentLogin.tsx:这是 PersistentLogin.tsx 中的代码:

const PersistLogin = () => {
   const [isLoading, setIsLoading] = useState(true);
   const refresh = useRefreshToken();
   const { access_token } = useAuth();

   useEffect(() => {
      const verifyRefreshToken = async () => {
         try {
            await refresh();
         } catch (e) {
            console.log(e);
         } finally {
            setIsLoading(false);
         }
      };

      !access_token ? verifyRefreshToken() : setIsLoading(false);
   }, [access_token, refresh]);

   return <>{isLoading ? <p>...Is loading</p> : <Outlet />}</>;
};

export default PersistLogin;

But I don't why when the user lands on home page of the website ('/'), the component isn't triggered, any body has an idea why?但是我不知道为什么当用户登陆网站的主页('/')时,该组件没有被触发,任何人都知道为什么?

It doesn't appear any of the Route components are rendered by the Routes component ( Routes from react-router-dom , not your Routes which will need to be renamed ).似乎没有任何Route组件是由Routes组件呈现的( Routes react-router-domRoutes ,而不是需要重命名的 Routes )。

Example:例子:

const AppRoutes = () => {
  const { user } = useAuth();

  return (
    <Router>
      <Routes> // <-- routes rendered into Routes component
        <Route index element={<Home />} />
        <Route path='auth-form' element={<AuthForm />}>
          <Route path='register' element={<Register />} />
          <Route path='login' element={<Login />} />
        </Route>
        <Route element={<PersistLogin />}>
          {user && (
            <>
              {(user.isDev ? DEV_NAVIGATION : RECRUITER_NAVIGATION)
                .map((nav) => (
                  <Route key={nav.path} path={nav.path} element={nav.component} />
                ))
              }
            </>
          )}
        </Route>
        <Route path='/*' element={<Navigate to='/' replace />} />
      </Routes>
    </Router>
  );
};

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM