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

如何从绑定Firebase的MUI DataGrid中删除行并同步后端数据

问题修复方案

你遇到的删除无法同步Firebase的问题,只需要修改三处代码即可解决:

1. 修正Firebase数据拉取逻辑,关联文档ID

你当前拉取Firebase数据时没有把文档ID存入数据的id字段,导致后续删除时找不到对应Firebase文档,修改onSnapshot监听逻辑:

const estudiantesRef = db.collection("usuarios").doc(user.uid).collection("estudiantes")
useEffect(() => {
  const unsubscribe = estudiantesRef.onSnapshot(snapshot => {
    const tempData = [];
    snapshot.forEach((doc) => {
      const data = doc.data();
      // 将Firebase文档ID存入数据的id字段,和DataGrid行ID对应
      tempData.push({...data, id: doc.id});
    });
    setEstudiantes(tempData);
  })
  // 组件卸载时取消监听避免内存泄漏
  return () => unsubscribe();
}, []);

2. 删除冲突的本地存储逻辑

你同时写了Firebase实时监听和localStorage读写的useEffect,会导致Firebase的更新被本地旧数据覆盖,直接删除下面两段代码即可:

// 删除这段
useEffect (() => {
  const estData = window.localStorage.getItem("estudiantes");
  setEstudiantes(JSON.parse(estData))
}, [])

// 不需要本地存储的话也可以删除这段
useEffect (() => {
  window.localStorage.setItem("estudiantes", JSON.stringify(estudiantes))
})

3. 修改删除按钮点击逻辑,同步调用Firebase删除接口

修改删除图标的onClick事件,先调用Firebase删除接口再更新前端状态:

renderHeader: () => {
  return (
    <IconButton
      onClick={() => {
        const selectedIDs = new Set(selectionModel);
        if (window.confirm('确定要删除选中的学生吗?')) {
          // 遍历选中的ID,逐个删除Firebase文档
          selectedIDs.forEach(docId => {
            db.collection("usuarios")
              .doc(user.uid)
              .collection("estudiantes")
              .doc(docId)
              .delete();
          })
          // 清空选中状态
          setSelectionModel([]);
          // 因为开启了Firebase实时监听,删除后前端会自动同步数据,本处手动更新状态可实现即时响应
          setEstudiantes((r) => 
            r.filter((x) => !selectedIDs.has(x.id))
          );
        }
      }}
    >
      <DeleteOutlinedIcon />
    </IconButton>
  );
}

数据更新逻辑参考

如果需要实现Firebase数据更新,可参考以下逻辑,因为你开启了onSnapshot实时监听,更新后前端会自动同步数据:

// 调用示例:updateEstudiante('文档ID', {nombre: '新名字', grado: '新年级'})
const updateEstudiante = (docId, updateData) => {
  db.collection("usuarios")
    .doc(user.uid)
    .collection("estudiantes")
    .doc(docId)
    .update(updateData);
}

内容的提问来源于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.01 17:36:03