【问题标题】:Problem adding to favorites with React Firebase使用 React Firebase 添加到收藏夹时出现问题
【发布时间】:2020-12-14 07:26:42
【问题描述】:

我正在尝试使用 firebase 将“添加到收藏夹”功能编码到博客中。为此,我有一个想法,即过滤包含所有文章的数组并仅保留用户最喜欢的文章。问题是我需要一个字段值 (isFavorite),它是一个布尔值,来检查它是否是用户最喜欢的文章之一,但这迫使我使用 .then() 来获取这个布尔值。不幸的是,我认为这 .then() 使我的 .filter() 没有过滤任何东西。

如果您知道如何使用可在 .filter() 条件下工作的表达式获取此字段值,请告诉我

    export default function FavoriteCardlist() {
  const [favoriteArticles, setFavoriteArticles] = useState([]);
  const [uid, setUid] = useRecoilState(userIDCheck);

  useEffect(() => {
    db.collection("articles").onSnapshot((snapshot) => {
      setFavoriteArticles(
        snapshot.docs.map((doc) => ({
          id: doc.id,
          article: doc.data(),
        }))
      );
    });
  }, []);

  const favoriteArticlesList = favoriteArticles
    .filter((article) =>
      db
        .collection("users")
        .doc(uid)
        .collection("favoriteArticles")
        .doc(article.id)
        .get()
        .then((doc) => doc.data()?.isFavorite)
    )
    .map((article) => (
      <div key={article.id}>
        <h2>{article.article.title}</h2>
      </div>
    ));

  return <div className="cardlist">{favoriteArticlesList}</div>;

【问题讨论】:

    标签: javascript reactjs firebase filter google-cloud-firestore


    【解决方案1】:

    你可能是

    .then((doc) => doc.data()?.isFavorite)
    

    没有返回值,因为 Promise 正在解决,因此您的过滤器无法正常工作。

    在您的“favoriteArticles”集合中,每个文档是否也有一个“isFavorite”字段?

    如果一篇文章已经被存储为用户的收藏夹,并且再次收藏夹,这听起来是多余的。看起来您正在请求所有文章,然后过滤它们,这将花费更多时间并花费更长的时间。

    如果这是针对单个页面并且您不需要所有文章,那么您可以对用户最喜欢的文章 ID 进行初始请求,然后使用构造的 ID 数组向文章集合发出请求。例如:

    firestore()
            .collection("users")
            .doc(uid)
            .collection("favoriteArticles")
            .get()
    .then(querySnapshot => {
     querySnapshot.forEach(documentSnapshot => {
    // update state array with article id
        });
      });
    
    
    firestore()
      .collection('articles')
      .where('id', 'in',[arrayOfFavoriteID's])
      .get()
      .then(querySnapshot => {
      // updateState for div to map through and render
      });
    

    【讨论】:

    • 非常感谢@mancony 的建议!我将您的代码放入 useEffect 并设法让 [arrayOfFavoriteID's] 运行良好,即使我必须为每篇文章“id”添加一个新字段:0LefJksmq .. 问题是当我映射时,它只给了我 3 个中的一个最喜欢的文章,而我有正确的最喜欢文章的 ID 数组。同样使用这种方法,我会被限制只有 10 篇最喜欢的文章吗?
    • 没问题。您是否为每篇文章手动添加了 id 字段?您应该能够使用快照中的 article.id 之类的东西来获取自动生成的 id。仅获得 3 个中的 1 个听起来像地图的结构不太正确。需要查看代码以确认,但听起来您没有对每个文档提出请求。您可能需要在文章的地图周围包裹一个 Promise.all,因为它们中的每一个都是一个单独的请求。由于每个请求都是一个承诺,Promise.all 应该在更新状态/组件之前等待每个请求解决。
    • 它现在工作正常@mancony,实际上这是由于我在 Firebase 中手动添加的用于测试的 id 中的拼写错误^^。但是,由于“in”限制,我最多只能拥有 10 个收藏夹。我非常感谢您的帮助,我会尝试找到一种解决方法来拥有超过 10 个收藏夹!再次,非常感谢,感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 2020-10-31
    • 2021-06-10
    • 1970-01-01
    相关资源
    最近更新 更多