【问题标题】:How delete/edit Firestore document from collection with react如何通过反应从集合中删除/编辑 Firestore 文档
【发布时间】:2021-02-27 20:04:43
【问题描述】:

所以我有一个使用 Firebase Firestore 和 React 的简单 CRUD 应用程序,并且我有一堆集合。在每个集合中,我都有带有图像的图像对象。 我找不到删除或编辑这些图像的方法。 目前,我可以通过该集合获取并显示图像。

这是我的代码。我想在 .

中添加删除和编辑按钮

请帮忙...


import React, { useState, useEffect } from "react";
import { useRouteMatch, Link } from "react-router-dom";
import { NewPhoto } from "./NewPhoto";
import { app } from "./base";

const db = app.firestore();

export const Album = () => {
  const [images, setImages] = useState([]);
  const [albumName, setAlbumName] = useState("");

  const match = useRouteMatch("/:album");
  const { album } = match.params;

  useEffect(() => {
    const unmount = db.collection("albums")
      .doc(album)
      .onSnapshot((doc) => {
        setImages(doc.data().images || []);
        setAlbumName(doc.data().name);
      });
      return unmount
  }, []);

  return (
    <>
      <section>
        <header>
          <h1>{albumName}</h1>
          <p>Go to the <Link to="/">Home page</Link></p>
        </header>
        {images.map((image) => (
          <aside key={image.name}>
            <img src={image.url} alt="album" />
          </aside>
        ))}
      </section>
      <footer>
        <NewPhoto currentAlbum={album} />
      </footer>
    </>
  );
};

【问题讨论】:

  • 执行删除的代码/函数在哪里?
  • 就是这样,我尝试了许多不同的代码,但没有一个可以工作。我最初尝试通过以下方式删除: deleteImage(id) { db.collection("album").doc(image[id]).delete() }
  • delete() 返回一个Promise,所以你可能想放一个then()catch()await 它。另外,我在您的代码中看不到任何按钮。
  • 是的,因为我没有实现它,因为它不起作用。您通过给我一个示例来解释如何编写删除函数来删除 Firestore 文档的一项?

标签: javascript reactjs firebase google-cloud-firestore react-router


【解决方案1】:

我不确定您要达到的目标或文档的外观,您的 url 图像是文档中的字符串还是存储在 firebase 存储中。

删除文档相对简单,只要您有文档参考,see these guides 说明如何删除文档,或者如果您想删除文档中的字段see these guides。如果您想从存储中删除图像,请查看this doc

或者,如果您只想更新该字符串,您可以使用these docs 来指导您

要在按钮下将该功能添加到您的代码中,您可以执行this post 中详述的操作

也许这样的东西对你有用;

import React, { useState, useEffect, useCallback } from "react";
import { useRouteMatch, Link } from "react-router-dom";
import { NewPhoto } from "./NewPhoto";
import { app } from "./base";

const db = app.firestore();

export const Album = () => {
  const [images, setImages] = useState([]);
  const [albumName, setAlbumName] = useState("");
  const [isSending, setSending] = useState(false);

  const match = useRouteMatch("/:album");
  const { album } = match.params;

  const deleteDoc =  useCallback((indexToRemove) => {
    setSending(true);
    db.collection("albums")
      .doc(album)
      .update('images', Firestore.FieldValue.arrayRemove(indexToRemove))
   .then (()=>{
      setSending(false);
      console.log("Album deleted");   
    });
   .catch (error => {
      setSending(false);
      console.log(error);
    });

  },[])

  useEffect(() => {
    const unmount = db.collection("albums")
      .doc(album)
      .onSnapshot((doc) => {
        setImages(doc.data().images || []);
        setAlbumName(doc.data().name);
      });
      return unmount
  }, []);

  return (
    <>
      <section>
        <header>
          <h1>{albumName}</h1>
          <p>Go to the <Link to="/">Home page</Link></p>
        </header>
        {images.map((image, index) => (
          <aside key={image.name}>
            <img src={image.url} alt="album" />
          </aside>
        ))}
      <input type="button" disabled={isSending} onClick={deleteDoc(index)} />
      </section>
      <footer>
        <NewPhoto currentAlbum={album} />
      </footer>
    </>
  );
};

【讨论】:

  • 是的,我确实没有正确解释。我有一个名为 =“albums”的集合,在其中,我有一些文档。在每个文档中,我都有一些图像,上面有他们的名字。两者都是字符串值(image.name 和 image.url)因此,通过在部分中添加一个删除按钮,我想删除相应的图像并在 firebase firestore 中更新它。感谢您的帮助,我尝试了您的代码并出现错误:“./src/Album.js 第 14:22 行:'useCallback' 未定义 no-undef 第 52:40 行:'isSending' 未定义 no-undef "
  • @SouhailMohamed,我编辑了上面的答案,这样你就不会遇到这些错误。
  • 非常感谢,代码现在确实可以正常工作了。但正如我所料,该功能不会删除我想要的。该函数删除 1 个“相册”文档,而不是其中的“图像”。为了更好地理解,这是我的 Firestore 的截图:snipboard.io/ecnEfo.jpg
  • 您的数据结构不适合您想要实现的目标,也许更好的解决方案是创建一个名为图像的集合,并将每个图像作为平面文档,这样 firestore通过将其链接回相册的属性,可以更快地建立索引并提高工作效率。
  • 我之前没有使用过Firestore.FieldValue.arrayRemove(index),但我已经修改了答案以帮助您。这个博客帮助了一些数组的东西。 firebase.googleblog.com/2018/08/… 请阅读其他非常有帮助的 firebase 文档。
猜你喜欢
  • 2021-11-14
  • 2018-10-19
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 2021-01-08
  • 2020-09-08
相关资源
最近更新 更多