Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

472
Visualizações
Reaccionar: botón para exportar datos de la base de datos Firebase Firestore

Estoy tratando de crear un botón en mi aplicación web React que exporte todos los datos o preferiblemente colecciones específicas de la base de datos Firebase Cloud Firestore como JSON.

A continuación se muestra con lo que estoy trabajando actualmente. Este tipo de obras, pero no correctamente. Cuando hago clic en el botón y descargo el JSON, estará vacío porque los datos aún no se cargaron. Cuando haga clic en el botón por segunda vez y descargue el JSON nuevamente, tendrá los datos deseados porque se cargó después del primer clic. He probado diferentes estructuras async y Promise para esperar todos los datos antes de iniciar la descarga pero hasta ahora he fallado. Los datos siempre se pueden descargar previamente con useEffect, pero esta no es una opción porque aumenta enormemente las llamadas de Firebase realizadas con la aplicación.

¿Cómo espera correctamente todos los datos antes de descargarlos? ¿Hay alguna manera diferente de lograr esto?

 function App() { const [download, setDownload] = useState([]) const downloadLink = useRef() const downloadMyCollection = async () => { const myCollection = collection(db, 'myCollection') const data = await getDocs(myCollection) setDownload(data.docs.map((doc) => ({...doc.data(), id: doc.id}))) downloadLink.current.click() } return ( <div> <button className="downloadButton" onClick={ downloadMyCollection }> Download Responses </button> <a href={`data:text/json;charset=utf-8,${encodeURIComponent( JSON.stringify(download) )}`} download='export.json' className='hidden' ref={downloadLink}> isHidden </a> </div> ) }
about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

No sé al 100% si esto funcionará, el hecho es que setState Hook es asíncrono, por lo que incluso setDownload se ejecutará antes del clic, el estado de descarga será una matriz vacía cuando se ejecute el evento click() .

Mi sugerencia es crear Hooks que escuchen el estado de descarga, verifiquen si no está vacío y luego activen el evento de clic.

 function App() { const [download, setDownload] = useState([]) const downloadLink = useRef() const downloadMyCollection = async () => { const myCollection = collection(db, 'myCollection'); const data = await getDocs(myCollection); setDownload(data.docs.map((doc) => ({...doc.data(), id: doc.id}))) }; useEffect(() => { if(!!download.length) downloadLink.current.click(); },[download]} return ( <div> <button className="downloadButton" onClick={ downloadMyCollection }> Download Responses </button> <a href={`data:text/json;charset=utf-8,${encodeURIComponent( JSON.stringify(download) )}`} download='export.json' className='hidden' ref={downloadLink}> isHidden </a> </div> ) }
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda