Глядя на ваш код, я не смог найти, где вы инициализируете вашу childData
.
Если предположить, что ваша база данных верна, то похоже, что вы не очищаете childData
перед тем, как назначить ее своейукажите здесь
this.setState({
messages: childData
});
Таким образом, когда ваш код запускает этот push childData.push(childSnapshot.val());
, он добавляет в ваш массив весь новый контент и сохраняет старый.
Пример:
Первое состояние:
// snapshot.val() contains ['Hello']
childData = ['Hello']
Подчиненный текст: World!
Обновленное состояние:
// snapshot.val() contains ['Hello', 'World']
childData = ['Hello', 'Hello', 'World!']
Для решения этой проблемы можно назначить массив только сновое значение, поэтому вместо использования push
, вы можете сделать что-то вроде этого childData = snapshot.val()
Я также предлагаю вам отладить ваш код с некоторыми console.log
, чтобы понять, что получает snapshot.val()
или childData
, или this.state.messages
Надеюсь, это поможет
Редактировать: Повторное чтение, возможной проблемой может быть также то, что, поскольку JS синхронизируется, ваш setState
вызывается раньшеваш forEach
закончен.Решением может быть использование async/await
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
Примерно так:
ref.on('value', async (snapshot) => {
const childData = await snapshot.map((childSnapshot) => {
childSnapshot.val();
});
this.setState({
messages: childData
});
(...)
Рассмотрим приведенный выше код в качестве примера
Надеюсь, это поможет