【问题标题】:Favorites not refreshing upon post to database收藏夹在发布到数据库时不刷新
【发布时间】:2021-01-12 07:17:11
【问题描述】:

您建议我应该实施哪些更改以解决收藏夹在发布到数据库时不刷新的问题?用户可以点击一颗心来收藏一个食谱。一旦用户单击它,心脏应该会从白色变为红色,从而将食谱添加到他们的收藏夹列表中。正在发生的事情是心脏不会改变颜色,并且在用户刷新屏幕之前,最喜欢的食谱不会出现在收藏列表中。这个应用程序是用 React 编码的,下面是我认为可以控制它的两个文件:

食谱:

const Recipe = ({ recipe }) => {
  const [show, setShow] = useState(false);
  const { label, image, url, ingredients } = recipe.recipe;
  const favorites = useContext(FavoritesContext);
  const recipeIsInMyFavorites =
    favorites.findIndex(
      (favorite) => favorite.recipe.uri === recipe.recipe.uri
    ) > -1;
  const uid = firebase.auth().currentUser.uid;
  const addToFavorites = () => {
    instance.post(`users/${uid}/favorites.json`, recipe).then((response) => {
      console.log(response);
      alert("This recipe has been added to your favorites' list");
    });
  };
  const noop = () => {
    alert("This recipe is already a favorite");
  };

  return (
    <>
      <div className="recipe">
        <h2>
          {label}
          <Popup
            trigger={
              <i
                className="fa fa-heart"
                style={{
                  fontSize: "30px",
                  color: recipeIsInMyFavorites ? "red" : "white",
                  float: "right",
                }}
                onClick={() =>
                  recipeIsInMyFavorites ? noop() : addToFavorites()
                }
              />
            }
            content="Click to favorite recipe"
            position="top left"
            style={{
              backgroundColor: "#FAD5DF",
              color: "black",
              fontSize: "20px",
            }}
          />
        </h2>

FavoritesContext:

export const FavoritesContext = createContext();

export function FavoritesProvider(props) {
  const [favorites, setFavorites] = useState([]);
  const { children } = props;

  // Make the DB Call
  useEffect(() => {
    var user = firebase.auth().currentUser;
    var uid;
    if (user != null) {
      uid = user.uid;
      db.ref(`users/${uid}/favorites`).on("value", (snapshot) => {
        console.log("favorites: ", snapshot.toJSON());

        const results = Object.entries(snapshot.toJSON() || {}).map(
          ([id, props]) => ({
            id,
            ...props,
          })
        );
        setFavorites(results);
      });
    }
  }, []);
  return (
    <FavoritesContext.Provider value={favorites}>
      {children}
    </FavoritesContext.Provider>
  );
}

【问题讨论】:

  • 您可能需要在 Recipe 组件中使用 useEffect 挂钩。这样您就可以知道何时有新数据从您的保存中返回。
  • 听起来不错,但我将如何实现呢?
  • 从我在 youtube 上看到的情况来看,useEffect 在发布到 api 时很有用,但我只是没有看到任何关于发布到数据库的信息

标签: reactjs firebase-realtime-database firebase-authentication


【解决方案1】:

这是我的代码中需要更改的内容:

const [recipeIsInMyFavorites, setRecipeIsInMyFavorites] = useState(false);
  useEffect(() => {
    setRecipeIsInMyFavorites(
      favorites.some((favorite) => favorite.recipe.uri === recipe.recipe.uri)
    );
  }, [favorites, recipe.recipe.uri]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多