【发布时间】:2020-01-25 19:11:17
【问题描述】:
我已经构建了一个 useFetch 函数,它在此之后紧密建模:https://www.robinwieruch.de/react-hooks-fetch-data 这是它的简化版本:How to correctly call useFetch function?
请注意,一旦启动提取,isLoading 将设置为 true。
我有一个用例,只有管理员用户才需要发出 fetch 调用。这是我添加到我的 React 组件中的代码:
const [companies, companiesFetch] = useFetch(null, {});
if (appStore.currentAccessLevel === 99 && !companies.isLoading && newUsers.companies.length === 0) {
console.log('About to call companiesFetch');
companiesFetch(`${API_ROOT()}acct_mgmt/companies`);
}
useEffect(() => {
if (!companies.isLoading && companies.status === 200) {
newUsers.companies = companies.data.companies;
}
}, [companies.isLoading, companies.status, newUsers.companies, companies.data]);
第一个 if 语句的想法是仅在以下所有条件都为真时才进行 fetch 调用:
1.当前登录的用户是管理员。
2. companiesFetch 之前没有被调用过。
3. newUsers.companies 尚未填充。
这似乎合乎逻辑,但如果我运行此代码,companiesFetch 会在应用程序崩溃之前被调用 25 次。我认为问题是时间问题,即companies.isLoading 设置得不够快。
你会如何解决这个问题?
【问题讨论】:
-
你能分享
companiesFetch的功能吗?如果有 fetch 不应该在useEffect内吗? -
@Alvaro 我已经修改了我的问题,以向您展示我是如何定义它的。我还提供了另一个帖子的链接,其中显示了我的实际
useFetch函数的简化版本。 -
为什么必须将
`${API_ROOT()}acct_mgmt/companies`传递给钩子和对companiesFetch()的调用? -
@PatrickRoberts 对此感到抱歉。我已经编辑了它的实际情况。第一行代码简单地定义了一个
useFetch的实例来获取公司的数据。然后在if子句中进行实际提取。我的问题实际上是关于为什么我在第一个if子句中检查的内容不足以阻止第二次输入该子句。换句话说,你会在第一个if中检查什么,只调用一次companiesFetch?
标签: javascript reactjs asynchronous react-hooks use-effect