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

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异常。

修复方案

  1. 调整编辑数据取值逻辑,取出真实值赋值给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依赖,避免闭包问题
  []
);
  1. 如果你的行ID存储在数据的uid字段而非DataGrid的行key中,只需要在提取数据时改为uid: rawEditData.uid.value即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:36:05