当我更改数据库时,为什么我的 React 应用程序在 useEffect 中运行 firebase 查询?

阿克沙

我的代码应该在第一次渲染时加载数据,所以我从 useEffect 中的 firebase 获取文档并将它们存储在状态“数据”中。它工作正常,所有文档都按照我的需要显示在页面上。现在我想通过单击每个文档下的按钮来删除单个文档。我是在 deleteDoc 函数的帮助下完成的,该函数从数据库中删除文档(如果存在,则从存储中删除一个文件)。删除工作正常,但删除成功后,我的代码出于某种原因再次从数据库重新加载数据,导致应用程序再次重新呈现页面。我在 useEffect 中的 2 个不同位置进行控制台登录,发现 useEffect 不会执行其中的整个代码,而只会执行从 firebase 获取数据的部分。我只是希望它在后台执行该操作,而不会再次干扰数据状态。那么如何在每次删除文档时停止重新获取呢?

 const [data, setData] = useState([]);

 useEffect(() => {
    if (user) {
      user.getIdTokenResult().then((idTokenResult) => {
        setAdmin(idTokenResult.claims.admin);
      });

      db.collection("files")
        .orderBy("timeStamp", "desc")
        .limit(5)
        .onSnapshot((snapshot) => {
          console.log(data, "In query"); // This executes after the delete operation
          setData(
            snapshot.docs.map((doc) => {
              return [doc.data(), { doc_id: doc.ref.id }];
            })
          );
        });
    }

    console.log(data, "Outside query"); // This doesn't execute after the delete operation
   }, []);

删除功能:

 const deleteDoc = async (e, item) => {
    e.preventDefault();

    // Deleting file from storage if it exists
    if (item[0].file_name) {
      const deleteTask = storage
        .ref("users/" + user.uid)
        .child(item[0].file_name);

      deleteTask
        .delete()
        .then(() => {
          console.log("File deleted Successfully");
        })
        .catch((err) => console.log(err));
    }
     
    // Deleting document from firestore collection.
    db.collection("files")
      .doc(item[1].doc_id)
      .delete()
      .then(() => {
        setData(
          data.filter((doc) => {
            return doc[1].doc_id !== item[1].doc_id;
          })
        );
        console.log("Document successfully deleted!", data);
      })
      .catch((error) => {
        console.error("Error removing document: ", error);
      });
  };
弗兰克·范·普费伦

通过调用onSnapshot从 Firestore 获取数据,您将附加一个永久侦听器,用于侦听实时更新因此,确实希望您的回调在数据库更改时再次被调用(从而再次更新状态)。

如果您只想获取一次数据,请使用get()代替onSnapshot()

db.collection("files")
  .orderBy("timeStamp", "desc")
  .limit(5)
  .get().then((snapshot) => {
    ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在我的游戏应用程序中查询 Firebase

为什么我的 addListenerForSingleValueEvent 停止从 android 应用程序中的 Firebase 数据库读取数据?

当我在我的应用程序中添加 Firebase 实时数据库时它开始崩溃

当我可以在Firebase中看到费用数据时,为什么我的应用程序中未显示费用数据?

在React应用程序中从Firebase项目访问数据的问题

在 React Native 应用程序中从 firebase 检索数据

我刚刚从 firebase 控制台删除了我的应用程序,但它仍在工作并在实时数据库中更改数据

约会应用程序-在Firebase Firestore中,我需要哪种数据库结构来查询除不喜欢我的用户之外的所有用户?

每当我在该SetupActivity中单击“保存”按钮时,我的应用就会崩溃。每当我要在Firebase数据库中写入时,我的应用程序崩溃

Firebase 数据库:为什么我查询的数据快照中的键/引用引用其父级?

如何在我的 React 应用程序中强制使用 Firebase 身份验证进行注册?

我们如何在 azure 应用程序洞察中显示数据库查询

分层应用程序中的数据库查询性能

当我更改状态时,为什么我的 React 应用程序没有重新渲染?

在应用程序关闭时检查Firebase数据库中的更改

无法在我的Web应用程序中访问Firebase Realtime数据库

当我尝试从 SQLite 数据库中删除一行时,为什么我的 android 应用程序崩溃?科特林

auth'未从React应用程序中的'firebase'导出

在 React Firebase 应用程序中恢复正确的 ID 元素

当在React SRSR应用程序中调用Firebase消息传递方法时,如何定义自我未定义?

当我在数据库查询中放置第4列时,我的应用程序崩溃

为什么我在React应用程序中的Fetch URL不会更改?

我的应用程序的“ React Hook useEffect缺少依赖项”警告

React.js:useEffect()依赖关系冻结了我的应用程序

我无法通过 Android Studio 中的 firebase 数据库中的查询搜索获取配置文件名称和图片。应用程序停止工作。任何修复?

如何将使用Webpack构建的React应用程序链接到phpmyadmin外部数据库并查询它,而无需在代码中显示数据库密码?

在Firebase Realtime数据库中更改值时如何查看flutter应用程序中的更改

在React应用程序中,我删除了Firebase上的组件数据,但是即使更改状态也不会从dom中删除它

如何在 Firebase 中设置规则,以便只有我的应用程序可以写入我的数据库 Firestore?