typescript - Masalah pemetaan data ReactJS+FireStore


Saya sedang menulis program kecil untuk mengambil kategori dari Firestore DB dan menampilkannya di halaman web sebagai daftar.

Kode saya terlihat seperti ini:

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});
  }
}

Saya bisa mengambil data dan bahkan mengisi this.state.Categories, namun fungsi map tidak dijalankan.

Pernyataan console.log menghasilkan sebuah array nilai tetapi fungsi map di render tidak dijalankan. Ada ide?

Output Console.log:

Jawaban #1

Anda memiliki kesalahan dalam menangani pengambilan data. Pada baris terakhir, kategori masih kosong, jadi itu memicu setState dengan kumpulan data yang kosong. Seharusnya seperti itu

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") 
         });

}

Jawaban #2

Hanya kembalikan data jika data tersebut ada. Cara paling sederhana untuk melakukan ini adalah dengan mengganti <ul>{categoryList}</ul> dengan <ul>{this.state.categories && categoryList}</ul>