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

279
Vistas
REACT + FIRESTORE: Escuche los cambios en la colección de base de fuego en un componente de reacción para actualizar automáticamente el estado de reacción

Tengo una colección de publicaciones en Firestore de la que obtengo todas las publicaciones creadas por los usuarios en una lista [usuario1, usuario2, ...]. Puedo escuchar los cambios en la colección usando onSnapshot en el siguiente método:

 export default function Feed({ friendList }) { // currentUser context const { currentUser } = useAuth(); // array to save posts from database const [posts, setPosts] = useState([]); // function to fetch data from database useEffect(() => { db.collection('posts') .where('userId', 'in', [...friendList]) .orderBy('timestamp', 'desc') .onSnapshot((snapshot) => { setPosts( snapshot.docs.map((doc) => ({ id: doc.id, post: doc.data(), })) ); }); }, []); return ( <div className='feed'> {currentUser ? ( <div className='feed_container'> {posts.map(({ id, post }) => { return ( <Post key={id} id={id} userProfileURL={post.userProfileURL} username={post.username} displayName={post.displayName} photoURL={post.photoURL} /> ); })} </div>

Pero esta consulta 'en' no funcionará si la lista de amigos tiene más de 10 elementos. Entonces puedo obtener los documentos requeridos de la colección usando promesas como:

 useEffect(() => { getPostsFromFriendsList(friendList); }, []); async function getPostsFromFriendsList(friendList){ const promises = []; for (let i = 0; i < friendList.length; i++) { promises.push(getPosts(friendList[i])); } const postsForHomeFeed = await Promise.all(promises); const array = []; for (let i = 0; i < postsForHomeFeed.length; i++) { postsForHomeFeed[i].docs.map((doc) => { array.push({ id: doc.id, post: doc.data(), }); }); } setPosts(array); } function getPosts(userId) { return new Promise((resolve, reject) => { db.collection('posts') .where('userId', 'in', [userId]) .onSnapshot((snapshot) => { resolve(snapshot); }); }); }

Pero ya no puedo escuchar los cambios en la base de datos para actualizar mi estado de reacción para representar en consecuencia si se agregó o eliminó una publicación en mi colección de Firestore. ¿Cómo puedo configurar mi useEffect para la solución de promesas en el segundo código de modo que pueda actualizar mi estado de reacción cada vez que haya un cambio en la colección de firestore? Gracias.

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

0

Debería dejar los oyentes abiertos y actualizar el estado cada vez que se activan y fusionar los datos de acuerdo con las id de publicación como aquí:

 useEffect(() => { getPostsFromFriendsList(friendList); }, []); //source: https://stackoverflow.com/questions/7146217/merge-2-arrays-of-objects const merge = (a, b, prop) => { var reduced = a.filter( (aitem) => !b.find((bitem) => aitem[prop] === bitem[prop]) ); return reduced.concat(b); }; async function getPostsFromFriendsList(friendList) { const promises = []; for (let i = 0; i < friendList.length; i++) { db.collection("posts") .where("userId", "in", [friendList[i]]) .onSnapshot((snapshot) => { const array = []; snapshot.docs.map((doc) => { array.push({ id: doc.id, post: doc.data(), }); }); setPosts(merge([...posts], array, "id")); }); } }
about 4 years ago · Juan Pablo Isaza Denunciar

0

Use el bloque onSnapshot en useEffect . Ejemplo sencillo;

 useEffect(() => { onSnapshot(collection(db, "profiles"), (snapshot) => { setProfiles(snapshot.docs.map((doc)=>({...doc.data(), id: doc.id}))) }) console.log(profiles); });

El estado de los profiles contendrá elementos actualizados todo el tiempo.

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