Я думаю, что мой вопрос на некоторое время кажется дубликатом, но я думаю, что это не так, я проверил много вопросов, имеющих одинаковое название, но с другим регистром
Проблема в том, что я был вынужден использоватьреагировать ловушкой дважды в моем коде, и я даже думаю сделать их тремя, но я чувствую, что это плохая практика, и я уверен, что есть обходной путь или решение для этого
У меня есть данные, которые я хочу первоначально получитьи я реализовал, что при первом вызове useEffect данные могут быть отфильтрованы или отсортированы позже, и у меня есть флажки фильтров и выбор для запросов сортировки, флажок будет фильтровать данные, а выбор опции будет сортировать их,Я использую метод redux и response-redux connect для создания дерева состояний, которое включает filters и sortBy
//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');
}
});
Теперь первый вызовдля первоначального извлечения данных из API, функция loadProducts не нуждается в каких-либо аргументах, а второй - при выполнении фильтрации или сортировки и функциив этом случае нужны аргументы, и он работает, когда любой из фильтров или sortBy изменяется
Я даже думаю сделать три вызова, разделив второй вызов на два вызова, как это:
useEffect(() => {
loadProducts(filters)
}, [filters])
useEffect(() => {
loadProducts(undefined, sortBy)
}, [sortBy])
и это потому, что я не хочу, чтобы фильтрация и сортировка происходили каждый раз, даже когда должен работать только один из них, потому что я думаю, что сортировка будет работать и тогда, когда пользователь только подбирает данные, и наоборот.
Этоmy fetchProducts действие:
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
}
}