查看您的代码,我找不到您在哪里初始化
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()
或
儿童数据
或
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
});
(...)
以上面的代码为例
希望有帮助