reactjs - 从 Firebase 数据设置状态会导致空白数据
问题描述
一旦我的 React 应用程序加载,我试图从我的 Firebase 加载所有“组”,但我的行为很奇怪。它首先将它们正确加载,因此如果我的数据库中保存了 3 个组,它将显示 1、2、3、4,如下所示:
但是一旦我将另一个组添加到列表中,它就会这样做:
我必须在 componentDidMount 上加载组的代码是这样的:
componentDidMount(){
this.setGroups();
}
setGroups(){
const groupRef = fire.database().ref('groups');
const groupArray = [];
const idArray = [];
groupRef.on('value', snapshot => {
snapshot.forEach(group => {
console.log('groupid: ' + group.key);
idArray.push(group.key);
let addGroup = {
id: group.key,
name: group.val().name
}
if(groupArray.length !== idArray.length){
groupArray.push(addGroup);
console.log('pushed');
}
})
this.setState(previousState => ({
groups: groupArray
}));
})
}
然后这就是我处理添加组的方式:
handleGroupAdd = (group) => {
const groupRef = fire.database().ref('groups').child(group.id).set({
name: group.name,
id: group.id
});
this.setState(previousState => ({
groups: [...previousState.groups, group]
}));
this.handleClose();
};
firebase 正确保存数据,没有重复的对象,因此它只是呈现混乱的组。我猜哪个州在添加上搞砸了?
解决方案
您的问题的解释:
您正在使用 启动快照侦听器groupRef.on
,每次您的内容发生更改时,此侦听器都会调用一个函数,然后每次都groupRef
将所有值推送到。groupArray
因为groupArray
是在快照函数之外声明的,所以它的内容在更新之间保持不变。
这是发生了什么:
- 第一次渲染:
setGroup
被称为 => groupArray
= [1,2,3,4];
- 添加组:
groupRef
监听器被触发 => 将 [1,2,3,4,5] 推送到groupArray
=> groupArray
= [1,2,3,4,1,2,3,4,5] => 状态更新handleGroupAdd
=>groups
状态 = [ ...上一页状态,5];
要解决您的问题,您可以:
- 只调用一次快照监听器:
groupRef.once('value', snapshot => {...
- 或仅依靠听众:
在快照函数中移动 groupArray 声明:
groupRef.on('value', snapshot => {
let groupArray = [];
...
并删除状态更新handleGroupAdd
;
我建议您依靠侦听器来保持前端和数据库之间的一致性,还有许多其他侦听器可以使用而不是“值”侦听器,您可以阅读官方文档以获取有关使用实时数据库列表的更多信息
推荐阅读
- python - 在 keras python 中拟合模型时检查模型输入时出错
- ios - 如何在 Swift 中为非拉丁字符正确应用笔画?
- c# - 附加 HTML 文档字符串,包括标签 ASP.NET CodeBehind
- python - 执行时Python Web Scraping for循环错误
- php - Laravel 验证奇怪的行为
- python - 创建一个包含音频文件信息的 json
- docker - 如何让 Jenkins 为不同的工作空间使用 maven 构建缓存?
- c# - 从另一个表单访问一个表单
- azure - 使用 Nestjs + Azure 函数配置 swagger
- python - Keras LSTM 损失为 NaN 和 acc 0