【发布时间】:2021-08-29 11:26:27
【问题描述】:
我试图以setEventsList 状态拥有eventList,但我总是得到一个无限循环。我已成功从 firebase 获取数据作为对象,我还想将对象更改为数组,以便 map 函数不会抛出错误。
import React, { useEffect, useState } from 'react';
import { realDB } from '../../firebase/firebase'
import Card from '../events/events'
function CardList(props) {
const [eventsList, setEventsList] = useState([]);
useEffect(() => {
const eventsRef = realDB.ref('/Events').limitToFirst(5);
eventsRef.on('value', (snapshot) => {
var events = snapshot.val();
let eventList = []
for (let id in events) {
eventList.push({
EventName: events[id].EventName,
EventEntryFee: events[id].EventEntryFee,
Eventsport: events[id].Eventsport,
eventCurrentParticipants: events[id].eventCurrentParticipants,
EventMaximumParticipants: events[id].EventMaximumParticipants,
EventTotalPrizes: events[id].EventTotalPrizes,
EventDifficulty: events[id].EventDifficulty
});
}
setEventsList(eventList);
console.log(eventsList);
});
}, [])
return (
<div>
{eventsList
? eventsList.map((event, index) => (
<Card key={index} />
)) : (
<><p> No data</p></>
)}
</div>
);
}
export default CardList;
// contents of '../../firebase/firebase'
import firebase from "firebase";
import 'firebase/auth'
// Initialize Firebase
const app = firebase.initializeApp({
apiKey: "AIzaSyBxxxxx1wQA",
authDomain: "fantasxxxxxxxaxxpp.x",
databaseURL: "https:xxxxxe.x.com",
projectId: "fxxxxxe",
storageBucket: "fantxxxm",
messagingSenderId: "xxxx",
appId: "1:xxx",
measurementId: "Gxx-xxxxx"
});
// firebase.analytics();
const db = app.firestore()
const realDB = app.database()
const auth = app.auth()
export { db, auth, realDB }
【问题讨论】:
-
eventsRef是否需要取消订阅才能移除侦听器并结束状态更新? -
我还是新手。我只想将 eventsList 的状态设置为 eventList 数组并将其映射到卡片组件。如何在当前代码不出现无限循环的情况下做到这一点?
-
我认为不应该
-
不太确定,
useEffect钩子只运行一次,所以要么发生了许多onValue事件,要么这个CardList组件被反复重新安装,所以每次都运行效果。您知道该事件多久发出一次吗?您可以使用useEffect(() => console.log('MOUNTED'), []);轻松测试重新安装理论,如果您看到一堆,那么您知道它正在重新安装。 -
@DrewReese 只有一次
标签: reactjs firebase firebase-realtime-database react-hooks