Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

104
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!