【发布时间】:2021-10-12 23:42:54
【问题描述】:
我正在做一个有很多反模式的项目,我看到的是围绕多个 useEffects 的 IIFE,这就是我所拥有的:
condition &&
(() => {
useEffect(() => {
const calOffsetTimeout = setTimeout(() => {
calcOffsetWidth();
}, 150);
return () => {
clearTimeout(calOffsetTimeout);
};
}, [menuWidth.isExpanded, pdfWrapperRef.current]);
useEffect(() => {
calcOffsetWidth();
}, [pdfWrapperRef, desiredScale, zooming]);
useEffect(() => {
calcOffsetWidth();
return () => pdf && pdf.destroy();
}, [pdf]);
useEffect(() => {
window.addEventListener('resize', calcOffsetWidth);
return () => {
window.removeEventListener('resize', calcOffsetWidth);
};
}, []);
})();
它可以工作,但缺点是我无法在这个 iife 函数中调试任何东西。我想知道将逻辑(尤其是钩子)包装到 iife 中的坏处或好处。我尝试的是在 deps 数组中添加条件,但是项目中的逻辑太多,一切都停止工作,所以这不是正确的决定。
【问题讨论】:
-
为什么不简单地移动效果内的条件?
-
@RameshReddy,我在我的问题中提到了这一点,它打破了在我应用于这个项目之前编写的逻辑
-
不,必须在组件的顶层调用钩子。不是有条件的,不是在嵌套函数或循环中。移除条件和 IIFE,以便效果挂钩位于组件主体中。您可能需要在钩子回调中移动条件并将其添加为需要它的依赖项,尽管很难用
condition之类的名称来判断。 -
Hooks 应该在功能组件的top-level 处无条件调用。我很惊讶这段代码有效。
-
那一定是
condition总是真实的,并且每个渲染周期都会调用钩子,并且 linter 不知何故不会在 IIFE 上得到响应。 ??????????♂️
标签: javascript reactjs react-hooks iife