Проблемные строки:
this.state.notes.push(new Note(snap.key, snap.val().noteContent));
или
this.state.notes.forEach(note => {
if(snap.key === note.id) {
note.id = snap.key;
note.noteContent = snap.val().noteContent;
}
});
this.setState({
notes: this.state.notes,
});
Вы не можете изменить значение состояния следующим образом. Вы должны использовать setState
.
Чтобы это исправить, нужно:
- копировать (глубокое клонирование) массив состояний (Вы должны использовать ImmutableJS, но это будет работать для тестирования:
const copiedArray = JSON.parse(JSON.stringify(array)))
- Внести изменения в скопированный массив
copiedArray
.
setState('notes', copiedArray)
Другие предложения:
Я бы предложил вам сделать следующее. Изолируйте слой огненной базы от слоя просмотра. Смешивать обязанности компонента с коммуникацией db не рекомендуется.
После того, как вы это сделаете. Вы передадите список заметок снаружи компонента. И любой метод, работающий с базой данных (firebase в вашем случае также станет параметром.)
// Notes Container
const notes = FireBaseConnector.getNotes();
const {
add,
edit,
delete,
} = FireBaseConnector
<Notes notes={notes}
onAdd={add}
onEdit={edit}
onRemove={delete}
/>