typescript - ReactJS+FireStore-tietojen kartoitusongelma


Kirjoitan pientä ohjelmaa noutaakseni kategoriat Firestore-tietokannasta ja näyttääkseni ne verkkosivulla listana.

Koodini näyttää tältä:

class Category extends Component {
  constructor() {
    super();
    this.state = {'Categories': []}
  }
  render() {
    let categoryList = null;
    if (Array.isArray(this.state.Categories)) {
      console.log(this.state.Categories);
      categoryList = this.state.Categories.map((category) =>  {
        return <li>{category.name}</li>
      });
    }
    return(
      <ul>{categoryList}</ul>
    );
  }
  componentWillMount() {
    // fetch the data from the Google FireStore for the Category Collection
    var CategoryCollection = fire.collection('Category');
    let categories = [];
    CategoryCollection.get().then((snapshot)=> {
      snapshot.forEach ((doc) => {
        categories.push(doc.data());
      });
    }).catch((error) => {
      console.log("Error in getting the data") 
    });
    this.setState({'Categories': categories});
  }
}

Voin hakea tiedot ja jopa täyttää this.state.Categories, mutta map-funktiota ei suoriteta.

Console.log-lause tuottaa arvotaulukon, mutta renderöinnissä käytettävä map-funktio ei suoritudu. Mitä ajatuksia?

Console.log-tulos:

Vastaus #1

Sinulla on virhe tietojen hakemisen käsittelyssä. Viimeisellä rivillä categories on edelleen tyhjä, joten se laukaisee setState:n tyhjällä tietojoukolla. Sen pitäisi olla jotain sellaista

componentWillMount() {

    fire.collection('Category').get()
        .then(snapshot => {
            const categories = snapshot.map(doc => doc.data());
            // sorry, but js object should be pascal cased almost always
            this.setState({ categories }); 
         })
         .catch(error => {
             console.log("Error in getting the data") 
         });

}

Vastaus #2

Palauta tiedot vain, jos tiedot ovat olemassa. Yksinkertaisin tapa tehdä tämä on korvata <ul>{categoryList}</ul> seuraavalla: <ul>{this.state.categories && categoryList}</ul>