javascript - 离子反应 + FIrebase。更新 firebase 中的数据时。循环项目被填充两次
问题描述
我有一个函数可以获取firebase实时数据库中的所有数据并将其放入一个数组中以便在反应中进行映射。但是当我进行更新时,添加。它只是将列表翻倍,但是当我切换到其他选项卡并再次返回时,它将返回原始数据,其中包含正确数量的项目。有人可以告诉我我做错了什么吗?
这是我输入组件时的数据
当我在 firebase 中进行更新时,结果是,有时 UI 也不会更新。我需要切换选项卡才能进行更改。
这是我检索数据和循环的代码。
const [doctors, setDoctor] = React.useState([]);
useEffect( () => {
console.log('Enter')
let newArr = []
firebase.database().ref('users').orderByChild('type').equalTo('doctor').on('value',(snapshot)=>{
let key;
snapshot.forEach( (childSnap) => {
key = childSnap.key
const snapVal = snapshot.val();
newArr.push(snapVal[key])
})
setDoctor(newArr)
})
}, [])
在循环:
<IonList>
{doctors.map((elem, index) => {
// index has to come from the second parameter from map
console.log(doctors)
return (
<IonItem key={index}>
<IonLabel>
<IonText className="font-weight: bold;">
<h3>{elem["name"]}</h3>
</IonText>
<h4>{elem["speciality"]}</h4>
<h4>{elem["email"]}</h4>
</IonLabel>
<br></br>
</IonItem>
);
})}
</IonList>
解决方案
当数据更改时,将on()
再次调用您的回调,并提供查询数据的完整快照。由于您在回调之外声明 ``,因此您最终会在前一个数据之后添加新数据,这就是您在 UI 中看到两组数据的原因。
解决方案是始终从一个新数组开始:
useEffect( () => {
console.log('Enter')
firebase.database().ref('users').orderByChild('type').equalTo('doctor').on('value',(snapshot)=>{
let key;
let newArr = []
snapshot.forEach( (childSnap) => {
key = childSnap.key
const snapVal = snapshot.val();
newArr.push(snapVal[key])
})
setDoctor(newArr)
})
}, [])
推荐阅读
- php - 从 RSS 源解析图像
- azure - 机器人如何发现我的 Azure 子域?
- python - Azure 机器学习工作室,Python 脚本输入格式
- python - PhantomJS 试图截取屏幕截图
- angular - Angular 5-在兄弟组件之间传递数据以同时使用
- javascript - 在浏览器中播放 MP3
- asp.net - 使用两个 FK 时无法创建关系
- python - “SyntaxError:在位置 0 的 JSON 中出现意外的令牌 #”在 python 中发出 http 请求时
- python - 在不使用数据库而是网络抓取的烧瓶应用程序中保护用户的凭据
- perl - 为什么在grep之后while不循环?