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

如何将Firestore集合中的文档数量赋值给变量以生成自增ID

问题根因

  • docRef1.get()是异步网络请求,你当前的代码没有等待请求返回结果,就直接执行了docRef2.set()操作,此时size还是useState初始赋值的空字符串,自然拿不到正确的计数。
  • React的setState是异步更新机制,调用setSize后,状态不会立刻在当前作用域生效,需要等到组件下一次渲染才能拿到更新后的size值,所以你在setSize之后立刻打印size还是旧值。

修复方案

你不需要把计数存到state里再用,直接在异步请求的回调里使用计算得到的临时值写入文档即可,两种写法参考:

写法1:保留Promise链式调用

const register = (e) => {
  e.preventDefault();
  const colRef = db.collection('usuarios').doc(user.uid).collection('estudiantes');

  colRef.get().then(snap => {
    // 计算得到新ID后再创建文档写入数据
    const newShowId = snap.size + 1;
    const docRef = colRef.doc();
    return docRef.set({
      nombre: firstName + " " + lastName,
      colegio: escuela,
      grado: grado,
      uid: docRef.id,
      id: newShowId
    })
  }).then(() => {
    history.push("/Inicio");
  })
}

写法2:async/await 写法逻辑更清晰

const register = async (e) => {
  e.preventDefault();
  const colRef = db.collection('usuarios').doc(user.uid).collection('estudiantes');
  // 等待集合查询结果返回
  const snap = await colRef.get();
  const newShowId = snap.size + 1;
  const docRef = colRef.doc();
  // 等待文档写入完成
  await docRef.set({
    nombre: `${firstName} ${lastName}`,
    colegio: escuela,
    grado: grado,
    uid: docRef.id,
    id: newShowId
  })
  history.push("/Inicio");
}

注意事项

这种通过查询集合总数生成自增ID的方案仅适合低并发的个人小项目使用,如果是有多人同时操作的生产环境,会出现并发冲突:两个请求同时查询到相同的集合总数,生成重复的ID,这种场景建议使用Firestore分布式计数器实现自增ID。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:54:03