• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pobieranie danych z firestore

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
140 wizyt
pytanie zadane 4 czerwca 2022 w JavaScript przez Zaqu93 Gaduła (4,850 p.)

Cześć.

Zacząłem robić bazę danych w firebase. Pobieram wartość z bazy danych i pushuje to do tablicy. Kiedy wypisuje całą tablicę to dane są poprawne, kiedy natomiast próbuje ją zmapować lub wypisać konkretny element tej tabeli to zwraca undefined. Nie bardzo rozumiem dlaczego oto kod:

import { useAuth } from '../context/AuthContext';
import { getFirestore, collection, getDocs } from "firebase/firestore";

const Tasks = () => {
    const { currentUser } = useAuth();

    let tasks = [];

    getDocs(collection(getFirestore(), 'userTasks')).then(snap => {
        snap.docs.forEach(ele => {
            if(ele.data().email === currentUser.email) {
                tasks.push({id: ele.id, ...ele.data()});
            }
        });
    }).catch(err => console.log(err));

    
    console.log(tasks); 
    /*
        [
            {
                "id": "pNH0ntPSVHdqqH5de11o",
                "tasks": {
                    "name": "Work",
                    "desc": "go to work"
                },
                "email": "test@test.com"
            }
        ]
    */

    console.log(tasks[0]) // undefined
    return ( 
        <main className="content adder">
            <div className="inner">
                <h1>Add Task</h1>
                <article className="main">
                    <ul>
                    </ul>
                </article>
                <div className="opts">
                    <input type="button" value="Add Task" />
                </div>
            </div>
        </main>
    );
}
 
export default Tasks;

console.log(tasks) wyświetla jednoelementową tablice, jednak console.log(tasks[0]) daje undefined. docelowo chce wyświtlać te dane w elemencie ul. Czy ktoś może powiedzieć dlaczego ta tablica się tak zachowuje?

1 odpowiedź

+2 głosów
odpowiedź 4 czerwca 2022 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 4 czerwca 2022 przez Zaqu93
 
Najlepsza

Elementy do tablicy wstawiasz asynchronicznie, natomiast console.log wyświetla na bieżąco aktualizowaną tablicę - a nie taką, jaka była w momencie wywołania console.log. Kod wygląda na React, a więc asynchroniczne akcje powinieneś wykonywać wewnątrz hooka useEffect, zaś sama tablica powinna być stanem (jeśli chcesz ją renderować):

import { useState, useEffect } from 'react';
import { useAuth } from '../context/AuthContext';
import { getFirestore, collection, getDocs } from "firebase/firestore";
 
const Tasks = () => {
    const { currentUser } = useAuth(); 
    const [tasks, setTasks] = useState([]); // tablica jako stan
   
    useEffect(() => {
      getDocs(collection(getFirestore(), 'userTasks')).then(snap => {
        snap.docs.forEach(ele => {
            if(ele.data().email === currentUser.email) {
                setTasks(prevTasks => [...prevTask, { id: ele.id, ...ele.data() } ]); // update stanu tablicy
            }
        });
      }).catch(err => console.log(err));
    }, []);

    /*
        [
            {
                "id": "pNH0ntPSVHdqqH5de11o",
                "tasks": {
                    "name": "Work",
                    "desc": "go to work"
                },
                "email": "test@test.com"
            }
        ]
    */

    return ( 
        <main className="content adder">
            <div className="inner">
                <h1>Add Task</h1>
                <article className="main">
                    <ul>
                    </ul>
                </article>
                <div className="opts">
                    <input type="button" value="Add Task" />
                </div>
            </div>
        </main>
    );
}
  
export default Tasks;

 

Podobne pytania

+1 głos
1 odpowiedź 319 wizyt
0 głosów
0 odpowiedzi 271 wizyt
pytanie zadane 10 listopada 2017 w SQL, bazy danych przez Rajju Nowicjusz (120 p.)
+1 głos
1 odpowiedź 709 wizyt

93,173 zapytań

142,184 odpowiedzi

321,967 komentarzy

62,499 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1149p. - dia-Chann
  2. 1131p. - Łukasz Piwowar
  3. 1124p. - CC PL
  4. 1118p. - Łukasz Eckert
  5. 1097p. - Michal Drewniak
  6. 1081p. - Marcin Putra
  7. 1076p. - rucin93
  8. 1054p. - Adrian Wieprzkowicz
  9. 1047p. - Piotr Aleksandrowicz
  10. 1000p. - ssynowiec
  11. 967p. - rafalszastok
  12. 931p. - Michał Telesz
  13. 886p. - Dominik Łempicki (kapitan)
  14. 842p. - Dawid128
  15. 819p. - Mariusz Fornal
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...