Je pense que ma question semble être un doublon mais je pense que ce n'est pas le cas, j'ai vérifié de nombreuses questions qui ont le même titre mais avec des cas différents.
Le problème est que j'ai été contraint d'utiliser deux fois le crochet react dans mon code et j'ai même pensé à en faire trois, mais je pense que c'est une mauvaise pratique et je suis sûr qu'il y a une solution pour contourner ce problème.
J'ai des données que je veux initialement récupérer et j'ai implémenté cela par premier appel à UseEffect les données peuvent être filtrées ou triées plus tard et j'ai des cases à cocher pour les filtres et une sélection pour les requêtes de tri, cocher une case filtrera les données et sélectionner une option les triera, j'utilise redux et react-redux. connecter pour créer l'arbre d'état qui comprend filtres et Trier par
//the first call
useEffect(() => {
loadProducts();
}, []);
//the second call
useEffect(() => {
loadProducts(filters, sortBy)
}, [filters, sortBy])
const mapStateToProps = (state) => ({
filters: state.filters,
sortBy: state.sortBy
});
const mapDispatchToProps = (dispatch) => ({
loadProducts: (filters, sortBy) => {
fetch('certain API').then(res => res.json()).then(json => {
dispatch(fetchProducts(json.products, filters, sortBy));
}).catch(err => 'error fetching data');
}
});
Maintenant, le premier appel est pour récupérer initialement les données de l'API, la fonction loadProducts n'a pas besoin d'arguments, et le deuxième est quand on fait le filtrage ou le tri et la fonction dans ce cas a besoin des arguments et il fonctionne quand l'un des filtres ou sortBy sont modifiés.
Je pense même à en faire trois appels en divisant le deuxième appel en deux appels comme ceci :
useEffect(() => {
loadProducts(filters)
}, [filters])
useEffect(() => {
loadProducts(undefined, sortBy)
}, [sortBy])
et c'est parce que je ne veux pas que le filtrage et le tri se produisent à chaque fois, même si un seul d'entre eux devrait fonctionner, parce que je pense que le tri fonctionnera également lorsque l'utilisateur n'a que des données qui conviennent et vice versa.
C'est mon fetchProducts action :
import { filterProducts, sortProducts } from './../../util/util';
export const fetchProducts = (products, filters, sortBy) => {
if (filters && filters.length) {
products = filterProducts(products, filters);
}
if (sortBy) {
sortProducts(products, sortBy);
}
return {
type: FETCH_PRODUCTS,
payload: products
}
}