【发布时间】:2022-02-07 00:32:49
【问题描述】:
在使用Firebase 和React 时,为了根据状态更改或内部数据库更改(例如来自另一个用户)获取数据,我经常依赖这样的代码:
useEffect(() => {
const getGamesInSelectedGroup = () => {
if (!state.currentGroup) {
return
}
const db = getDatabase();
const resp = ref(db, `/games/${state.currentGroup.name}`);
onValue(resp, (snap) => {
if (snap.exists()) {
const data = snap.val()
const games = Object.keys(data).map(k => ({id: k, group: state.currentGroup.name, ...data[k]}))
setState((prev) => ({
...prev,
games: games,
isLoaded: true,
}));
return
}
setState((prev) => ({
...prev,
games: null,
isLoaded: true,
}));
toast.warning("no data for " + state.currentGroup.name)
})
}
getGamesInSelectedGroup();
}, [state.currentGroup])
但是,我想知道,每当state.currentGroup 更改时,是否会创建/games/${state.currentGroup.name} 的新侦听器?如果是这样,是否有办法在创建新的侦听器之前取消订阅以前的侦听器?
我正在考虑用get 调用替换onValue,仍然以state.currentGroup 为条件,并在useEffect 之外使用onValue 以反映“内部”数据库更改。
【问题讨论】:
标签: javascript reactjs firebase firebase-realtime-database