如何编写一个包含多个异步函数的自定义钩子,以便我可以在自定义钩子上分离逻辑?

How to write a custom hook which has multiple async functions inside it so that I can separate logic on the custom hook?

提问人:FiFi 提问时间:12/26/2022 更新时间:12/26/2022 访问量:38

问:

自定义钩子 useCast 的代码如下:

const useCart = () => {
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);
  const [cart, setCart] = useState([]);
  const toast = useToast();

  const addToCart = async (categoryId, quantity) => {
    setLoading(true);
    try {
      const res = await ax.post("/cart", { category: categoryId, quantity });
      setCart(res.data?.categories);
    } catch (err) {
      console.log(err);
      setError(err.response?.data);
    }
    setLoading(false);
  };

  const getCartList = async () => {
    setLoading(true);
    try {
      const res = await ax.get("/cart/");
      setCart(res.data);
    } catch (err) {
      console.log(err);
      setError(err.response?.data);
    }
    setLoading(false);
    return cart;
  };

  const emptyCartState = () => {
    setCart([]);
  };

  useEffect(() => {
    if (error)
      toast({
        title: error,
        status: "error",
        isClosable: true,
      });
    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, [error]);

  return {
    addToCart,
    cart,
    useCartLoading: loading,
    useCartError: error,
    getCartList,
    emptyCartState,
  };
};

export default useCart; 

它是这样称呼的:

const { user } = useContext(AuthContext);
  const { cartDispatch } = useContext(CartContext);

  const { cart, getCartList, useCartLoading } = useCart();

  // const viewCartList = async () => {
  //   try {
  //     const res = await ax.get("/cart/");
  //     return res.data;
  //   } catch (error) {
  //     console.log(error.response?.data);
  //   }
  // };

  useEffect(() => {
    if (user) {
      const updateCart = async () => {
        const updatedCart = await getCartList();
        console.log(updatedCart);
        // console.log(useCartLoading);
        cartDispatch({ type: "UPDATE_CART", payload: updatedCart });
      };
      updateCart();
    } else {
      cartDispatch({ type: "UPDATE_CART", payload: [] });
    }
  }, [user]);

谁能帮我解决这个问题?每当我使用自定义钩子时,它都不起作用。注释掉的 ViewCartList 可以工作,所以我猜它是未正确实现的自定义钩子。自定义挂钩返回旧数据,并且在首次调用时不返回更新的数据。就像它在第二次调用同一请求时返回更新的数据一样。 如何实现自定义钩子?我想要实现的是,我想分离自定义钩子上的逻辑,并根据自定义钩子返回的内容,我想更新页面上的上下文值。钩子中的函数必须是异步的。

javascript node.js reactjs react-hooks mern

评论

0赞 Pranay Binju 12/26/2022
如果您可以分享相同的示例链接,将会很有帮助
0赞 lpizzinidev 12/26/2022
您应该在内部处理当前正在处理的逻辑,因为您将其用作调度程序和状态管理器。useCartCartContext

答: 暂无答案