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

116
Vistas
La variable calculada devuelve undefined en useEffect

Estoy creando una aplicación de chat en React Native con Firestore backend.

Mi estructura es así:

 Channels -Channel { user1, user2, messages:[] (This is a subcollection not an array inside the document) }

Quiero verificar si hay un canal que contiene los usuarios seleccionados.

Función de verificación:

 const [chatRef, setChatRef] = useState() let channelRef = db.collection("Channels") channelRef.get().then((snapshot) => { snapshot.forEach((doc) => { let room = doc.data() if ( (room.user1.id === user.id || room.user2.id === user.id) && (room.user1.id === personToChat.id || room.user2.id === personToChat.id) ) { setChatRef(channelRef.doc(room.id).collection("Messages")) } else { channelRef.doc(user.id).set({ user1: user, user2: personToChat, }) setChatRef(channelRef.doc(user.id).collection("Messages")) } }) })

efecto de uso:

 useEffect(() => { const unsubscribe = chatRef.onSnapshot((querySnapshot) => { const messagesFirestore = querySnapshot .docChanges() .filter(({ type }) => type === "added") .map(({ doc }) => { const message = doc.data() return { ...message, createdAt: message.createdAt.toDate() } }) .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime()) appendMessages(messagesFirestore) }) return () => unsubscribe() }, [])

¿Qué probé?

  • Traté de usar una variable en lugar de un estado. No funcionó.
  • Traté de obtener la variable chatRef con una función. No funcionó.
  • Usé chatRef como una dependencia. No funcionó.
  • Llamé a la función de verificación dentro de useEffect. No funcionó.

Todo esto conduce al mismo error, que es TypeError: undefined is not an object (evaluating 'chatRef.onSnapshot')

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

0

Lo resolví enviando chatRef como accesorio desde el componente principal. Y lo usó como una dependencia en el componente secundario.

Esta función es de la página de la lista de contactos. Maneja el evento de prensa en los contactos. Cuando se hace clic, navega a la sala de chat. Usé React.useRef para almacenar el chatRef y enviarlo como accesorio a la sala de chat.

 if ( (room.user1.id === user.id || room.user2.id === user.id) && (room.user1.id === contact.id || room.user2.id === contact.id) ) { chatRef.current = channelRef.doc(room.id).collection("Messages") navigation.navigate("ChatRoom", { personToChat: contact, chatRef: chatRef.current, }) }

Luego, en la pantalla de la sala de chat, lo usé como una dependencia y verifiqué si es nulo.

 useEffect(() => { if (chatRef) { const unsubscribe = chatRef.onSnapshot((querySnapshot) => { const messagesFirestore = querySnapshot .docChanges() .filter(({ type }) => type === "added") .map(({ doc }) => { const message = doc.data() return { ...message, createdAt: message.createdAt.toDate() } }) .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime()) appendMessages(messagesFirestore) }) return () => unsubscribe() } }, [chatRef])
about 4 years ago · Juan Pablo Isaza Denunciar

0

Ocurre porque su estado chatRef no se inicializa cuando su useEffect se está ejecutando. Su useEffect solo se ejecuta una vez debido a la matriz vacía de dependencias.

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