Вызов setState
должен быть внутри обратного вызова value
:
var merchants = [];
merchantsRef.once('value').then((snapshot) => { // here too!
// ... and add it to the matches array
console.log(snapshot.val().business_name)
merchants.push({
business_name: snapshot.val().business_name,
_key: snapshot.key
})
console.log("Array " + merchants.business_name)
this.setState({
data: merchants,
loading: false
})
}).catch((error) => { // If you are planning to use this here
console.log('Error fetching merchant data:', error)
})
Причина этого в том, что обратный вызов вызывается асинхронно, что означает, что в вашем коде setState
с массивом merchants
вызывается до того, как вы заполнили массив.
Самый простой способ увидеть поток - это несколько хорошо расположенных операторов записи:
console.log("Before starting to load");
merchantsRef.once('value').then((snapshot) => {
console.log("Data loaded");
})
console.log("After starting to load");
Когда вы запускаете этот код, вывод:
Перед началом загрузки
После начала загрузки
Данные загружены
Это, вероятно, не то, что вы ожидали, но прекрасно объясняет, почему массив пуст, когда вы вызываете setState
с массивом merchants
в вашем коде.