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>
