javascript - 为什么导出到另一个文件时 onSnapshot 侦听器不工作
问题描述
我设置了一个 onSnapshot 侦听器函数,但是一旦我将它解压缩到另一个文件,它就停止工作了。
下面的代码在实用程序文件中。
export const getUserCampsites = () => {
const user = store.getState().authReducer.user
let campsitesArr = [];
//check if user is signed in
if(user.hasOwnProperty('uid')){
const campsites = db
.collection('campsites')
.where('owner', '==', user.uid);
const unsub = campsites
.onSnapshot(snapshot => {
snapshot.forEach(el => {
campsitesArr.push(el.data());
})
});
return {unsub, campsitesArr}
}
}
这就是我在组件中的内容:
const [camps, setCamps] = useState();
useEffect(() => {
const res = getUserCampsites()
if(res) {
const campsites = res.campsitesArr
setCamps(campsites);
return(() => res.unsub())
}
}, [user])
当组件中的“setCamps”被调用时,数组返回为空,但随后在第二次重新渲染时被填充,我是否遗漏了什么?它应该是异步的吗?
提前致谢!
解决方案
getUserCampsites 函数中的数组 campsitesArr 不是响应式的,因此如果其值发生变化,则不会重新返回。当调用 getUserCampsites 函数时,它会将 campsitesArr 初始化为一个空的 arr,然后初始化侦听器。但是,它不会等待侦听器获取值,然后继续执行下一行,即 return 语句。因此,无论何时返回,campsitesArr 仍然进入,因此您始终返回一个空数组。
最好的解决方案是将一个函数作为参数传递给 getUserCampsites,它接收一组营地。每当侦听器获取新值时,都会调用此函数。例如,您可以将一个函数传递给 getUserCampsites,该函数使用新的营地数组调用 setState
推荐阅读
- java - 将字符串时间转换为本地时间以进行比较
- c - 遍历双向链表会永远运行(尽管有明显的 NULL 终止符)
- python - 什么数据结构允许多键访问,甚至是其他键?
- node.js - sequelize 中的 DataType 有什么作用?为什么在参数中传递它并在没有定义它的情况下运行?
- flutter - 如何在脚手架小部件的 AppBar 下方而不是下方显示正文?
- c++ - 在单臂霓虹灯寄存器中有效地将 8 位数字扩展到 12 位
- react-native - React Native 安装对我不起作用
- python - 战争纸牌游戏模拟器中的无限循环
- mysql - 使用 SQL 查询具有不同 RDBMS 的数据库
- c# - 如何为 bot builder sdk bot 设置 LuisModel