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

123
Vistas
Operador condicional de ruta privada en ReactJS

Parece un tema trivial.

Tengo una aplicación, donde la gente puede suscribirse a través de "stripe". Me gustaría dar acceso a algunas URL según la suscripción; de lo contrario, las llevaría de vuelta a la página de "perfil".

Un par de cosas no están funcionando.

  1. La consulta de Firebase para obtener la suscripción no da resultados en la suscripción. De alguna manera, onSnapShot no obtiene nada. Probablemente porque el UID es nulo al comienzo de la representación de la página.

  2. El operador condicional on no funciona. No estoy seguro de cuál es el problema en este.

 function PaidRoutes(props) { const [subscription, setSubscription] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { const unsub = auth.onAuthStateChanged((authObject) => { unsub(); if (authObject) { setLoading(true); const uid = auth.currentUser?.uid; console.log('UID ==>', uid); let docRef = query(collection(db, 'customers', uid, 'subscription')); console.log('DOC REF ==> ', docRef); onSnapshot(docRef, (snap) => { snap.forEach((doc) => { console.log('Role of Subscription', doc.data().role); setSubscription(doc.data().role); }); }); } else { console.log('not logged in'); setLoading(false); } }); return () => { unsub(); }; }, []); return ( <Route {...props} render={(props) => subscription ? ( <Component {...props} /> ) : ( <Redirect to='/profileScreen' /> ) } /> );

Gracias Drew por comentar. La versión instalada de react-router-dom es 5.2.0

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Problemas)

Posibles problemas que veo en el código de PaidRoute :

  1. La función de cancelación de suscripción se llama en el controlador de estado de autenticación, esto podría permitir que la verificación de autenticación funcione una vez en un cambio de autenticación inicial, pero luego cancelará la suscripción y dejará de funcionar hasta que el componente se vuelva a montar.
  2. El estado loading es inicialmente false , por lo que cualquier verificación basada en él en el renderizado inicial no hará lo que desea. La loading tampoco se usa para retrasar la representación condicional.
  3. El estado subscription es inicialmente una matriz vacía que aún es verdadera, por lo que la verificación lógica condicional probablemente permitirá el acceso a la ruta protegida de todos modos, independientemente de cualquier estado de autenticación.

Solución

  1. No cancele la suscripción del oyente de cambio de autenticación en la devolución de llamada.
  2. Comience con loading inicialmente verdadera para manejar el ciclo de renderizado inicial. Renderizar condicionalmente nulo o algún indicador de carga.
  3. Comience con un estado de subscription nulo.

Código:

 function PaidRoutes(props) { const [subscription, setSubscription] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const unsubscribe = auth.onAuthStateChanged((authObject) => { if (authObject) { setLoading(true); const uid = auth.currentUser?.uid; console.log('UID ==>', uid); const docRef = query(collection(db, 'customers', uid, 'subscription')); console.log('DOC REF ==> ', docRef); onSnapshot(docRef, (snap) => { snap.forEach((doc) => { console.log('Role of Subscription', doc.data().role); setSubscription(doc.data().role); }); }); } else { console.log('not logged in'); setSubscription(null); // <-- reset auth state } setLoading(false); // <-- clear loading state outside if-else }); return unsubscribe; }, []); if (loading) { return null; // or loading indicator, spinner, etc... } return subscription ? ( <Route {...props} /> ) : ( <Redirect to='/profileScreen' /> ); }
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