Firebase更新嵌套集合时报s.indexOf is not a function错误如何解决
问题根因
你遇到的s.indexOf is not a function at Function.n.fromString是Firebase SDK抛出的典型错误,触发条件是调用doc()方法时传入的文档ID参数不是字符串类型(可能是对象、undefined、数字等非字符串值)。
代码问题排查
你的代码存在两个核心问题:
- MUI DataGrid的
editRowsModel结构不符合你的预期:每一行的编辑数据会将所有字段值包裹在value属性中,结构如下:
你直接将model[行ID] = { 字段名: { value: 编辑后的值 } }model[editedIds[0]]完整赋值给editRowData,导致editRowData下的所有属性都是{value: xxx}格式的对象,而非你预期的原始值,你打印时看到的预览可能是格式化后的结果,展开后就能看到真实的对象结构。
另外行ID本身是model的键值,不是model[行ID]的内部属性,你之前取editRowData.uid本身逻辑就是错的。 useCallback依赖editRowData会触发闭包陷阱,可能拿到旧的状态值,导致传入doc()的ID异常。
修复方案
- 调整编辑数据取值逻辑,取出真实值赋值给
editRowData
const [editRowsModel, setEditRowsModel] = React.useState({}); const [editRowData, setEditRowData] = React.useState({}); const handleEditRowsModelChange = React.useCallback( (model) => { const editedIds = Object.keys(model); if (editedIds.length === 0) { // 先加类型校验,避免非法参数传入Firebase const studentDocId = editRowData.uid; if (typeof studentDocId !== 'string' || !studentDocId) { console.error('无效的学生文档ID:', studentDocId); return; } const temporalQuery = db.collection("usuarios").doc(user.uid).collection("estudiantes").doc(studentDocId); temporalQuery.update({ nombre: editRowData.nombre, colegio: editRowData.colegio, grado: editRowData.grado }) } else { const rowId = editedIds[0]; const rawEditData = model[rowId]; // 手动提取每个字段的value,同时把行ID作为uid赋值 setEditRowData({ uid: rowId, nombre: rawEditData.nombre.value, colegio: rawEditData.colegio.value, grado: rawEditData.grado.value }); } setEditRowsModel(model); }, // 移除editRowData依赖,避免闭包问题 [] );
- 如果你的行ID存储在数据的
uid字段而非DataGrid的行key中,只需要在提取数据时改为uid: rawEditData.uid.value即可。
内容的提问来源于stack exchange,提问作者React Enjoyer
相关产品推荐
相关产品推荐

