reactjs - 在从 `useEffect` 调用的`useCallback` 中设置和使用状态时的无限循环
问题描述
我想在用户更改时获取数据。
为此,我有一个useEffect
在更改时触发user
的函数,它调用一个函数来获取数据。
问题是useEffect
因为它依赖于getData
并且getData
改变了因为它同时使用和设置而被频繁地调用loading
。
有没有办法解决这个问题,同时仍然保留getData
为一个函数,就像我在别处所说的那样。
const getData = useCallback(async () => {
if (!loading) {
try {
setLoading(true);
const { error, data } = await getDataHook();
if (error) {
throw new Error("blah!");
}
} catch (error) {
const message = getErrorMessage(error);
setErrorMessage(message);
setLoading(false);
}
}
}, [loading]);
...
useEffect(() => {
const callGetData = async () => {
await getData();
};
callGetData();
}, [user, getData]);
解决方案
尝试loading
从移动useCallback
到useEffect
。像这样的东西:
const getData = useCallback(async () => {
try {
const { error, data } = await getDataHook();
if (error) {
throw new Error("blah!");
}
} catch (error) {
const message = getErrorMessage(error);
setErrorMessage(message);
}
}, []);
...
useEffect(() => {
const callGetData = async () => {
await getData();
};
if (!loading) {
setLoading(true);
callGetData();
setLoading(false);
}
}, [user, getData, loading]);
推荐阅读
- typescript - 属性 X 的类型不兼容
- symfony - Symfony 4 - 在远程站点上查找 URL 时出现 404 错误
- ruby-on-rails - Google Calendar API - 群组参与者电子邮件
- ios - 为什么单击按钮时这些框的颜色不会改变?(迅速)
- mysql - 在遇到锁争用之前,特定的 MySQL 行可以多久更新一次?
- vbscript - 将 .dat 文件转换为 .xlsx,其中所有数据为文本格式
- kotlin - Kotlin when(Pair<>),还有其他方法吗?
- ios - 如何在多个项目上运行 xcodebuild 命令,但对每个项目应用不同的签名规则
- ruby - 在 Postman 上获取输出的正确方法 - 将哪个参数放在哪里?
- json - 使用 Decodable 解析 JSON