我觉得我的问题似乎有点重复,但我认为并不是,因为我查看了许多标题相同但大小写不同的问题。
问题是我被迫在我的代码中两次使用react hook,甚至考虑让它们变成三个,但我感觉这是一种不好的做法,我相信有一个解决方法或解决方案。
我有一些数据,我想要最初获取,并通过第一个useEffect调用实现了这一点。稍后可以对数据进行过滤或排序,我有过滤复选框和一个用于排序查询的选项卡,选择一个复选框将对数据进行过滤,选择一个选项将对数据进行排序,我使用redux和react-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函数不需要任何参数,第二次则在进行筛选或排序时,此时函数需要参数,并且当任何一个筛选器或排序方式发生变化时,该函数会起作用。我甚至考虑将它们分成三个调用,将第二个调用分成两个调用,如下所示:
useEffect(() => {
loadProducts(filters)
}, [filters])
useEffect(() => {
loadProducts(undefined, sortBy)
}, [sortBy])
这是因为我不希望每次仅需要一个条件进行筛选或排序时都进行筛选和排序,因为我认为当用户只筛选数据时,排序也会起作用,反之亦然。
这是我的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
}
}
mapStateToProps
的一部分而不是动作创建器的一部分,会怎样呢? - skyboyeruseEffect
没有清理功能,可能会遇到竞争条件,并且如果您能够连续发送多个请求,则可能会导致 UI 闪烁。 - skyboyer