提问人:FiFi 提问时间:12/26/2022 更新时间:12/26/2022 访问量:38
如何编写一个包含多个异步函数的自定义钩子,以便我可以在自定义钩子上分离逻辑?
How to write a custom hook which has multiple async functions inside it so that I can separate logic on the custom hook?
问:
自定义钩子 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 可以工作,所以我猜它是未正确实现的自定义钩子。自定义挂钩返回旧数据,并且在首次调用时不返回更新的数据。就像它在第二次调用同一请求时返回更新的数据一样。 如何实现自定义钩子?我想要实现的是,我想分离自定义钩子上的逻辑,并根据自定义钩子返回的内容,我想更新页面上的上下文值。钩子中的函数必须是异步的。
答: 暂无答案
评论
useCart
CartContext