Данные загружаются из Firebase асинхронно. Пока это происходит, ваш основной код продолжает работать, поэтому пользовательский интерфейс не блокируется. Затем, как только данные становятся доступны, ваш обратный вызов вызывается с этими данными.
Проще всего это увидеть, поместив несколько операторов журнала:
setEvent(state){
console.log("Before starting to load data");
firebase.database().ref('eventos')
.on('value',event =>{
console.log("Got data");
});
console.log("After starting to load data");
},
Когда вы запускаете этот код, он регистрирует:
Перед началом загрузки данных
После начала загрузки данных
Получил данные
Хотя это, вероятно, не то, что вы Ожидается, это полностью объясняет, почему ваши данные не отображаются. К тому времени, когда вы позвоните setState
, items
еще не будет заполнен.
Чтобы решить эту проблему, переведите ваш setState
вызов в обратный вызов on()
:
setEvent(state){
firebase.database().ref('eventos')
.on('value',event =>{
let items = [];
event.forEach(data =>{
items.push(data.val())
})
state.events = items
});
},
Вне зависимости от текущей проблемы, я настоятельно рекомендую также хранить data.key
в вашем массиве, поскольку вам обязательно понадобится его в дальнейшем, когда вам нужно найти элемент из массива в базе данных.
Код для этого может быть, например:
event.forEach(data =>{
items.push({ "$id": data.key, ...data.val() })
})
Таким образом, ключ сохраняется в $id
, а все остальные свойства копируются как есть.