useEffect() 和 Google Firebase onAuthStateChange

Posted

技术标签:

【中文标题】useEffect() 和 Google Firebase onAuthStateChange【英文标题】:useEffect() and Google Firebase onAuthStateChange 【发布时间】:2021-08-09 22:41:54 【问题描述】:

每当组件挂载时,都会调用 onAuthStateChange(setCurrentUser),其中传入了一个设置 currentUser 状态的函数。Firebase 然后根据用户是否登录返回一个身份验证对象,我用它来设置currentUser 的状态以及使用 createUserDocument() 将数据保存在 firestore 中。

auth.onAuthStateChanged(async userAuth ....) 返回什么?我很困惑,因为它的返回值被分配给取消订阅,每当组件卸载时都会调用它。

function onAuthStateChange(callback) 
  return auth.onAuthStateChanged(async userAuth => 
    if (userAuth) 
      const userRef = await createUserDocument(userAuth); 
      userRef.onSnapshot(snapShot => 
        callback(
          id: snapShot.id, 
          ...snapShot.data()
        )
      )
     else 
      callback(null); 
    
  )


function App() 
  const [currentUser, setCurrentUser] = useState(null); 
  useEffect(() => 
      const unsubscribe = onAuthStateChange(setCurrentUser); 
      return () => 
        unsubscribe(); 
      ; 
  , [])

【问题讨论】:

【参考方案1】:

根据documentation onAuthStateChanged 返回firebase.Unsubscribe。当您调用此函数时,Firebase 会确保从 Observables 中删除此请求(因此 firebase 不会通知您不再存在的组件,这可以防止错误或内存泄漏或浪费计算能力)。

Observables 是在 Firebase 内部实现的,这就是当特定状态发生变化时它们决定谁请求通知的方式。

【讨论】:

以上是关于useEffect() 和 Google Firebase onAuthStateChange的主要内容,如果未能解决你的问题,请参考以下文章

Google 开源的 Python 命令行库:初探 fire

python [fire] Google出品的,方法或类变成agument传进去

谷歌移动广告和 Kindle Fire

Google Cloud Messaging (GCM) 可以与 Kindle Fire 搭配使用吗?

React Hooks-调用依赖于“一次” useEffect的状态的函数的最佳位置?

无法在 useEffect 挂钩中测试超时功能