reactjs - 由 axios 取消令牌引起的 react useEffect hook 无限循环 [react-hooks/exhaustive-deps]
问题描述
在我的反应组件中,我useEffect
用来获取组件安装的数据以及每次过滤器更改时的数据。一切正常,但react-hooks/exhaustive-deps
会发出警告,即 fetcher 函数应位于依赖项数组中。通过将 fetcher 添加到依赖项列表,应用程序进入无限循环。fetcher 在每次运行时都会收到一个新的 Axios 取消令牌,这会导致对 fetcher 的调用无限循环。在不禁用规则的情况下,我应该如何处理这种情况?
他 fetcher 函数在 之外useEffect
,导致另一个回调函数(传递给孩子)可能会调用 fetcher。例如,可以编辑用户并在成功编辑时调用 fetcher 以重新加载新用户的模式
const [isLoading, setIsLoading] = React.useState<boolean>(false);
const [users, setUsers] = React.useState<IUser[]>([]);
const [filters, setFilters] = React.useState<ITableFilters>({...initFilters});
const fetcher = async (s: CancelTokenSource): Promise<void> => {
setIsLoading(true);
const params = { ...filters };
try {
const { data} = await fetchAllUsers({
params,
cancelToken: s.token
});
setUsers(data.users);
setIsLoading(false);
} catch (error) {
handleResponseError(error);// wchich checks axios.isCancel
setIsLoading(false);
}
}
React.useEffect(() => {
const source = axios.CancelToken.source();
// tslint:disable-next-line: no-floating-promises
fetcher(source);
return function cleanup() {
source.cancel();
};
}, [filters]);
解决方案
您可以使用useCallback
,因此对 的引用fetcher
应该保持不变,不会导致更多的重新渲染。
const fetcher = useCallback(async (s: CancelTokenSource) => {
setIsLoading(true);
const params = { ...filters };
try {
const { data} = await fetchAllUsers({
params,
cancelToken: s.token
});
setUsers(data.users);
setIsLoading(false);
} catch (error) {
handleResponseError(error);// wchich checks axios.isCancel
setIsLoading(false);
}
}, [setIsLoading, setUsers, filters])
推荐阅读
- c - 为什么我需要使用 strdup()?
- java-11 - JDK 11 没有反映
- python - 无法将对象的属性重新分配给另一个现有对象
- android - 自适应图标定位问题
- spring-boot - Spring cloud gcp DatastoreRepository 在没有自动配置或注释的情况下初始化
- c# - c# 带有子组件的 Blazor 通用页面
- powerbi - 计算度量的 SUM 并为 Power BI 中的每一行填充它
- c++ - 无法链接到 CLion Rcpp 项目中的 Rcpp 库
- google-cloud-platform - GKE 中具有身份验证的 API 网关
- python-3.x - 有条件地从另一个熊猫df填充数据?