1 回答
TA贡献1936条经验 获得超6个赞
将钩子视为直接在组件中具有相同的代码。这意味着每次组件渲染时,钩子都会运行。
例如你定义:
let cartId;
// ...
if (!cartId || cartId.length === 0) {
createCart();
}
语句中的内容将在每次cartId创建时在每次渲染上运行,并且此时没有分配任何值。而不是使用if语句使用useEffect:
export const useGuestCart = () => {
const [cartId, setCartId] = useState(0);
const [createCart, { data, error, loading }] = useMutation(
MUTATION_CREATE_CART
);
const resetGuestCart = () => {
// function body here
};
useEffect(() => {
if(!cartId || cartId.length === 0){
createCart();
}
}, [cartId]);
useEffect(() => {
// Here we need to consider the first render.
if (loading) {
console.log(`Started loading`);
} else {
console.log(`Finished loading`);
}
}, [loading]);
useEffect(() => {
// Here we need to consider the first render.
console.log(`Got cart id ${data.createEmptyCart}`);
setCartId(data.createEmptyCart);
}, [data]);
return [cartId, resetGuestCart];
};
另请注意,useCallback如果未记忆接收函数的组件,则使用没有实际好处。
添加回答
举报