You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

初始加载时useEffect无法获取Firebase数据,仅快速刷新后显示

更新

下方@Chris的回答解决了我的问题。我安装了React Firebase Hooks包,并按以下方式配置代码,现在一切运行正常!:)

const [value] = useCollection(collection(db, `${sessionUserId}`), {
    snapshotListenOptions: { includeMetadataChanges: true },
  })
  useEffect(() => {
    if (value) {
      const allData = JSON.parse(
        JSON.stringify(
          value?.docs.map((doc) => ({
            id: doc.id as string,
            resultData: doc.data() as DocumentData,
          }))
        )
      )
      setAllLogs(allData)
    }
  }, [value])

我的项目技术栈

NextAuthjs、Firebase、Recoiljs

我使用useRecoilState钩子存储用户创建的日志:

const [allLogs, setAllLogs] = useRecoilState(modalAllLogs)

modalAllLogs的定义如下:

export const modalAllLogs = atom<Array<DocumentData>>({
  key: 'allLogs',
  default: [],
})

问题描述

我通过useEffect钩子从数据库获取用户数据并调用setAllLogs更新状态(注:状态仅在此处更新):

useEffect(() => {
    const docQuery = query(
      collection(db, `${sessionUserId}`),
      orderBy('timestamp', 'desc')
    )
    const unsubscribe = onSnapshot(
      docQuery,
      (snapshot: QuerySnapshot<DocumentData>) => {
        const data = JSON.parse(
          JSON.stringify(
            snapshot.docs.map((doc: QueryDocumentSnapshot<DocumentData>) => ({
              id: doc.id as string,
              resultData: doc.data() as DocumentData,
            }))
          )
        )
        setAllLogs(data)
      }
    )
    return unsubscribe
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [db])

实际现象:初始渲染时,allLogs返回空数组且始终为空;只有修改该文件并保存,触发NextJS的快速刷新后,allLogs才会正确显示数据。打印snapshot发现初始渲染时它也是空的。

通过输入添加数据时,Firebase能正确存储数据,仅存在初始加载时数据无法加载的问题。

我不确定问题所在,可能是RecoilState的使用方式有误?

我尝试过多种方案:将依赖改为allLogs(导致无限循环)、使用getDocs()替代onSnapshot()等,但均无效。


内容的提问来源于stack exchange,提问作者Ariel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:31:16