【问题标题】:How to delete doc in firebase with React application如何使用 React 应用程序删除 firebase 中的文档
【发布时间】:2020-06-08 18:13:28
【问题描述】:

我创建了一个小型 react 应用程序,您可以输入书名和作者姓名,它会在表单下方显示列表,它也存储在 firebase 数据库中。如果你想删除它,你可以在前端删除它,但是我在我的 firebase 数据库中删除它时遇到了麻烦,因为我不确定如何动态引用 doc id。如果我在代码中提供 id,它可以删除这个特定的 id,但用户不能在前端提供 id。希望有人帮助我,谢谢!

import React, {useContext} from 'react'
import {BookContext} from '../contexts/BookContext'
import firebase from '../config/fbConfig'

const BookDetails = ({bookProp}) => {
    const {actionDispatch} = useContext(BookContext)

    const handleOnClick = () => {
        actionDispatch({type: "REMOVE_BOOK", id: bookProp.id})


        firebase.firestore().collection('books').doc(id).delete()
        .then(()=>{console.log("successfully deleted! ")})
        .catch((error)=>{ console.log("Error removing document:", error)})
    }
    return(
        <div>
            {
                <li onClick={handleOnClick}>
                    <div className="title">{bookProp.title}</div>
                    <div className="author">{bookProp.author}</div>
                </li>
            }
        </div>
    )
    }

export default BookDetails

【问题讨论】:

  • 在不知道 ID 的情况下,您无法删除文档。您需要确保您的代码可以使用任何 ID。
  • 您能否建议我应该如何在我的反应代码中引用正确的 firebase doc id?
  • 当您查询文档时,您会得到一个对象,该对象具有一个 data() 属性来保存您的查询数据和一个 id 属性,它为您提供了 firebase 为该文档分配的 uid。如果您发布查询以获取文档,我将能够向您展示如何获取 uid。

标签: javascript reactjs firebase google-cloud-firestore


【解决方案1】:

如果您有权访问图书名称,并且该名称存储在图书文档中的 name 字段中,则可以使用 where 查询来获取对图书文档的引用并将其删除。

let bookName = "War And Peace";

firebase.firestore().collection("books").where("name", "==", bookName).get()
.then(querySnapshot => {
    querySnapshot.docs[0].ref.delete();
});

querySnapshot.docs[0].ref.delete(); 语句获取与名称查询匹配的第一本(也可能是唯一一本)书籍并将其删除。

另一种方法是在获取书籍文档时获取 id 并存储它,就像 Vaibhav Joshi 说的那样。

【讨论】:

  • 听起来不错,但它会抛出此错误消息'TypeError:无法读取未定义的属性'ref'。理想情况是从 ID 字段中删除。当我通过以下方式添加书名和作者时,我能够检索到确切的 ID: firebase.firestore().collection('books').add({ title: {title}, author: {author}, }) 。 then(function(docRef){ console.log("document ID:", docRef.id); }) .catch(function(error){ console.error("Error: ", error) }) } 但不要知道如何连接它以删除部分..
  • 您收到“TypeError”,因为您的查询与任何文档的名称字段都不匹配。请记住,您查询的书名必须与存储的图书文档的名称字段 100% 匹配。这意味着如果大小写有任何差异,任何额外的空格或符号,您的查询将不匹配,您将得到“无法读取未定义的属性 'ref'”。您还可以将另一个 'where' 查询与查询链接匹配书籍的作者,以防有多个同名书籍,但这意味着作者的姓名也必须 100% 匹配。
  • 通过在创建文档时获取 id,您只能在该会话中使用该 id,除非您将其存储在某处,我认为这不是您想要的。为了解决您的问题,我需要更多用例详细信息,例如您如何获取书籍的详细信息,您是一次获取“书籍”等集合下的所有文档,还是获取特定用户的集合并将其显示在该用户下?您如何在客户端存储书籍列表?
  • 我创建了一个组件文件夹,并在 BookForm.jsx 中添加书籍和作者,并在 BookDetails.jsx 文件中删除书籍和作者。我将它放在我的 github 存储库中,您可以查看并感谢您的反馈。 github.com/jthinlay/reactapp_bookslist/tree/master/src
  • 我不是 React 开发人员,但我确实看过您的代码。您在哪里从 Firestore 检索文档?在 repo 中,您似乎正在使用 localStorage 来存储文档。如果您还想要的话,为什么不保存您在添加到 firestore 时获得的 firebase 生成的 id 以及 uuid 包生成的 id。从 firestore 获取文档时,还将从 querySnapshot 获取的生成 id 以及 bookState 中的标题和作者姓名存储为对象数组,并将每个文档的 id 传输到 BookDetail.jsx 上的 handleOnClick 函数并从那里删除它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多