如何将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
相关产品推荐
相关产品推荐

