#javascript #reactjs #react-native #react-query
Вопрос:
Я пытаюсь выполнить запрос, когда массив должен быть обновлен, но запрос выполняется немедленно!
Итак, у меня есть checkedProducts
массив, в который я вставляю некоторые данные при монтировании экрана, поэтому моя цель-выполнить запрос, когда в этом массиве будут данные.
вот в чем загвоздка
import {useQuery} from 'react-query';
import {checkAvailableProducts} from '../Api';
export type checkProductItem = {
product_id: number;
detail_id: number;
};
export interface checkProducts {
products: checkProductItem[];
}
export const useCheckAvailableProducts = (products?: checkProducts) => {
console.log('products-RQ', products);
return useQuery(
['checkAvailableProducts'],
() => checkAvailableProducts(products),
{
enabled: !!products?.products, // OR products?.products.length > 0 not works
},
);
};
компонент
....
const [checkedProducts, setCheckedProducts] = useState<checkProducts>();
const {data: unavailableProducts, refetch} = useCheckAvailableProducts(
checkedProducts,
);
React.useEffect(() => {
if (cartProducts.length) {
let productsIDs = cartProducts.map(prod => {
return {
product_id: prod.id,
detail_id: prod.detail_id,
};
});
Promise.all(productsIDs).then(allProductsIDs => {
console.log('allProductsIDs', allProductsIDs);
return setCheckedProducts({
products: allProductsIDs,
});
});
}
}, [cartProducts]);
React.useEffect(() => {
const unsubscribe = navigation.addListener('focus', () => {
refetch();
console.log('unavailableProducts:', unavailableProducts);
if (unavailableProducts amp;amp; unavailableProducts.length > 0) {
console.log('hey if0update!!!');
updateCart(unavailableProducts);
}
});
// Return the function to unsubscribe from the event so it gets removed on unmount
return unsubscribe;
}, [navigation, refetch, unavailableProducts, updateCart]);
Комментарии:
1. Что такое
cardProducts
. Обещание?2. @testing_22 это массив, который я использовал
zustand
, поэтому я сохранил корзину там, просто получите их вот такconst cartProducts = useCartProduct(state => state.cartProducts);
3. Могу я спросить вас, почему вы
Promise.all
их? Просто пытаюсь понять твою проблему4. @testing_22 Я просто жду
map(..)
завершения итерации , а затем используюPromise.all
для установки состояния с разрешенными даннымиallProductsIDs
, если я ошибаюсь, исправьте меня 😉5. Хорошо. Не уверен. Я имею в виду, если массив состоит из обещаний, поэтому имеет смысл использовать этот метод