reactjs - useEffect 缺少一个 const 函数的依赖项
问题描述
useEffect(() => {
let interval = null;
if (isOn) {
interval = setInterval(() => {
counting();
}, 1000);
} else {
clearInterval(interval);
}
return () => clearInterval(interval);
}, [isOn, currentTimeMs]);
const counting = () => {
setCurrentTimeMs(currentTimeMs + 1);
};
我认为 useEffect 的依赖只接受变量,但它也要求我放置一个 const 函数?这是为什么?这是 webpack 的错误还是什么?
React Hook useEffect 缺少一个依赖项:'counting'。要么包含它,要么移除依赖数组 react-hooks/exhaustive-deps
我也收到另一个警告:
'counting' 函数使 useEffect Hook(第 39 行)的依赖关系在每次渲染时都发生变化。将它移到 useEffect 回调中。或者,将 'pace' 定义包装到它自己的 useCallback() Hook react-hooks/exhaustive-deps
我以为我已经在 useEffect 回调中调用了。有人可以解释吗?该文档并没有过多地说明 useEffect 及其回调。
解决方案
声明const
的变量仍然是变量。在这种情况下,您重新定义counting
了每个渲染周期,但是 const 意味着在渲染周期期间counting
不能为变量重新分配值。因为您在每个渲染周期重新定义它是您看到第二个警告的原因。
如果没有其他调用counting
,那么只需将其移动到效果内。这消除了将其包含在依赖数组中的需要,并且仅在效果的回调触发时才被定义。
useEffect(() => {
let interval = null;
const counting = () => {
setCurrentTimeMs(currentTimeMs => currentTimeMs + 1);
};
if (isOn) {
interval = setInterval(counting, 1000);
} else {
clearInterval(interval);
}
return () => clearInterval(interval);
}, [isOn]);
注意 1:我将更新转换setCurrentTimeMs
为使用功能状态更新,因为状态取决于先前的状态。
注意 2:我还currentTimeMs
从依赖数组中删除了,因此每次状态更新时设置的时间间隔不超过一个isOn
。[编辑]实际上,这没关系,因为清理函数会处理清除上一个周期设置的间隔。currentTimeMs
尽管没有必要,但仍应删除。
推荐阅读
- file - 解析 AIDE 文件以计算模式之间的行数
- android - Firebase/Crashlytics not reporting all crashes
- javascript - 在 NodeJS 中使用快速路由方法时出错
- ios - 无法使用 AWS S3 iOS 开发工具包从存储桶的子文件夹下载
- google-cloud-platform - Which Role for start stop VM instance only
- vert.x - How can I share the same Event Loop from VertX in Lettuce-io
- bash - 在 bash 单行器中使用 python2.7、perl、sed 搜索和替换 ini 文件中的项目
- f# - F# - 构造嵌套类型
- java - Program opening in CMD then closing immediately (java)
- sql-server - Save a Query as stored procedure and let it iterate through an array