reactjs - 如何取消订阅 Firestore 中的集合更改
问题描述
我正在尝试取消订阅 Firestore 中的更改侦听器,但无法使其正常工作。
根据 Firebase 文档,您需要调用 onSnapshot() 方法来停止监听。我错过了什么?
https://firebase.google.com/docs/firestore/query-data/listen
这是调用订阅/取消订阅操作创建者的钩子:
useEffect(() => {
subscribe()
return () => {
unsubscribe()
}
}, [])
以下是订阅/取消订阅操作创建者:
export const subscribe = () => {
return (dispatch) => {
const items = db.collection('items')
items.onSnapshot((snapshot) => {
const data = snapshot.docs.map((item) => item.data())
dispatch({ type: 'DO_SOMETHING', payload: data })
})
}
}
export const unsubscribe = () => {
const items = db.collection('items')
const unsubscribe = () => items.onSnapshot(() => {})
unsubscribe()
}
谢谢!
解决方案
在您的unsubscribe
实际示例中,您创建另一个侦听器并立即取消订阅它,因此它不会影响正在运行的侦听器subscribe
。
export const subscribe = (setUnsubscribe) => {
return (dispatch) => {
const items = db.collection('items')
const unsubscribe = items.onSnapshot((snapshot) => {
const data = snapshot.docs.map((item) => item.data())
dispatch({ type: 'DO_SOMETHING', payload: data })
});
setUnsubscribe(unsubcsribe);
}
}
// Component
useEffect(() => {
let unsubscribe = () => {};
subscribe((func) => { unsubscribe = func });
return () => unsubscribe();
}, [])
推荐阅读
- r - 自动化(手动)R 代码以计算 P 值
- cplex - 如何使用模型中的解决方案来解决另一个问题
- autodesk-forge - 使用 Forge API 读取 REVIT 文件中的族
- javafx - 从控制器类外部调用的 gridpane.getchildren().add() 会阻止程序
- c# - 如何检测 TrailRenderer 创建的闭环,然后在里面获取游戏对象
- javascript - 如何在动态选择组件角度中设置选择默认值
- python - os.path.abspath 没有给出工作目录的完整路径
- mysql - 将 CTE 存储过程转换为 Mysql 兼容的数据库查询
- php - If Conditional 有两个角色
- bash - 在脚本中使用 telnet 命令发送邮件