Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

102
Vistas
La aplicación React/Firebase muestra la pantalla de inicio de sesión antes de que finalice la autenticación

Cuando se registra/inicia sesión/actualiza la página, la página de inicio de sesión parpadea justo antes de ir a la página correcta. Intenté instalar un cargador, pero todo lo que hace es hacer una animación del cargador antes de que parpadee y luego vaya a la página correcta. ¿Alguna idea de cómo hacer que esto no suceda?

 function App(){ const [user, setUser] = useState(); const [loading, setLoad] = useState(true); useEffect(() => { const unsubscribe = onAuthStateChanged(getAuth(), setUser, setLoad(false)) return () => {unsubscribe()} }, []) const AuthenticatedRoute = ({children}) => { let isAuthenticated; if(user !=null){ isAuthenticated = true; }else{ isAuthenticated = false; } if(!loading){ return isAuthenticated? children: <Navigate to="/signin"/> }else{ return <Loading/> } } const UnauthenticatedRoute = ({children}) => { let isAuthenticated; if(user !=null){ isAuthenticated = true; }else{ isAuthenticated = false; } if(!loading){ return !isAuthenticated? children: <Navigate to="/home"/> }else{ return <Loading/> } } return( <Router> <div className="App"> { <Routes> <Route exact path="/" element={<UnauthenticatedRoute><PreHome/></UnauthenticatedRoute>}/> <Route path='/home' element={<AuthenticatedRoute><Home/></AuthenticatedRoute>} /> <Route exact path="/signin" element={<UnauthenticatedRoute><Signin/></UnauthenticatedRoute>} /> <Route exact path="/signup" element={<UnauthenticatedRoute><Signup/></UnauthenticatedRoute>} /> </Routes> } </div> </Router> ) }

Código de cierre de sesión: esta línea ha estado funcionando para cerrar sesión

 <button onClick={() => signOut(getAuth())}>Sign Out</button>

Código de inicio de sesión:

 async function OnFormSubmit(e){ e.preventDefault(); const auth = getAuth(); try{ isLoading(true); await signInWithEmailAndPassword(auth, email, pw) isLoading(false); }catch(err){ console.log(err) } }
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Problemas

  1. El estado de carga solo se borra cuando hay un error en onAuthStateChanged .
  2. Los componentes del protector de ruta se declaran dentro de otro componente de React. Esto es anti-patrón. Cuando se declaran nuevas "instancias" de estos componentes cada vez que se vuelve a representar el componente principal de la aplicación, se desmontará/montará el App del componente.
  3. Los componentes no esperan a que se resuelva el estado de autenticación del usuario antes de decidir redirigir o representar el contenido enrutado.

Solución

  • Saque los componentes del protector de ruta por su cuenta. Renderice un Outlet para que las rutas anidadas se rendericen. Esto le permite representarlos como rutas de diseño en lugar de componentes envolventes individuales.
  • Utilice un estado de "carga" adecuado. Utilice el estado de user indefinido como el "estado de carga".

Ejemplo:

 import { Outlet, Navigate } from 'react-router-dom'; const AuthenticatedRoute = ({ user }) => { if (user === undefined) return <Loading />; return user ? <Outlet /> : <Navigate to="/signin" />; }; const UnauthenticatedRoute = ({ user }) => { if (user === undefined) return <Loading />; return user ? <Navigate to="/home" /> : <Outlet />; };

...

 function App(){ const [user, setUser] = useState(); useEffect(() => { const unsubscribe = onAuthStateChanged(getAuth(), setUser); return unsubscribe; }, []); return( <AuthContextProvider> <Router> <div className="App"> <Routes> <Route element={<UnauthenticatedRoute user={user} />}> <Route path="/" element={<PreHome />} /> <Route path="/signin" element={<Signin />} /> <Route path="/signup" element={<Signup />} /> </Route> <Route element={<AuthenticatedRoute user={user} />}> <Route path='/home' element={<Home />} /> </Route> </Routes> </div> </Router> </AuthContextProvider> ); }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda