我想我了解如何通过返回来分离侦听器,但在这种特定情况下,我不确定最好的方法。
我有一个 React 组件,我在其中使用 onAuthStateChanged
订阅身份验证更改。
如果它返回一个用户:我在 Firestore 中为该用户的数据创建了一个监听器。
useEffect(() => {
return firebase.auth.onAuthStateChanged(user => {
if (user) {
const unsubscribeFirestore = firebase.db
.collection('users')
.doc(user.uid)
.onSnapshot(doc => {
setUser({ user, ...doc.data() })
})
} else {
setUser({ user })
}
})
}, [firebase])
我应该在哪里以及如何返回 unsubscribeFirestore
以分离它?
答案 0 :(得分:2)
您的代码似乎已经从 unsubscribe
隐式返回了 firebase.auth.onAuthStateChanged
回调,但是您可以通过在局部范围变量中捕获返回的 unsubscribe
函数来使其更具必要性。>
您可以在要在 useEffect
清理函数中访问的 React ref 中捕获内部快照取消订阅。
const snapShotUnsubscribeRef = useRef();
useEffect(() => {
const unsubscribe = firebase.auth.onAuthStateChanged(user => {
if (user) {
snapShotUnsubscribeRef.current = firebase.db
.collection('users')
.doc(user.uid)
.onSnapshot(doc => {
setUser({ user, ...doc.data() })
})
} else {
setUser({ user })
}
});
return () => {
snapShotUnsubscribeRef.current?.();
// Or if you can't use Optional Chaining:
// snapShotUnsubscribeRef.current && snapShotUnsubscribeRef.current()
unsubscribe();
};
}, [firebase]);
答案 1 :(得分:1)