【发布时间】:2020-03-07 15:08:14
【问题描述】:
尽管尝试了不同的方法,但我似乎无法找到答案。我不断收到错误:
Line 18:5: React Hook useEffect has a missing dependency: 'execute'. Either include it or remove the dependency array react-hooks/exhaustive-deps
printWarnings
在这个文件上:
import {useEffect, useState} from 'react'
export const createEffect = (fs, dependency) => {
const[data, setData] = useState({})
const execute = () => (
fs().then(res => {
setData(res)
}).catch(err => {
// do some magic
})
)
useEffect(() => {
execute()
const interval = setInterval(execute, 15000)
return(() => clearInterval(interval))
}, [dependency])
return(data)
}
TLDR 是我需要每 15 秒或在某些全局状态更改时(由 dependency 定义)向 fs() 定义的特定 API 函数发出一个获取请求。我还想捕获数据和任何错误,因此我用几个 then() 和 catch() 块包裹 fs()。
当我在功能组件中执行以下代码时,顶部会出现警告:
import createEffect from './components/createEffect'
~~~
let api = new api('http://localhost:8080/v1');
const[status, updateStatus] = useState(true);
const summary = createEffect(api.getSummary, status)
知道如何解决这个问题吗?如果这是做这样的事情的正确方法,我是 React useEffect 的新手,而不是 100%?在我的 useEffect 调用中将 execute 指定为依赖项会导致应用程序不断地重新渲染。我在调用 setInterval() 之前运行 execute(),因为我希望查询每 15 秒运行一次,并且在组件首次呈现时运行。
更多背景信息:我正在制作一个仪表板作为示例项目,并希望每 15 秒或在某些全局状态更改时立即查询多个 api 端点。如果全局状态确实发生了变化,我想将我的 HTTP 轮询从剩下的任何时间重置为 15 秒。
【问题讨论】:
-
您是否在 useEffect 内部以外的任何地方使用
execute?如果没有,您可以简单地将声明移到 useEffect 中以消除警告 -
如果我在我的 useEffect 函数中移动
execute(),我会得到同样的错误,但这次是关于fs()函数:React Hook useEffect has a missing dependency: 'fs'
标签: reactjs fetch setinterval use-effect usecallback