在useEffect中使用额外依赖项会产生什么后果



假设我有这个代码:

useEffect(() => {
makeBreakfast(pig)
}, [pig, chicken])

makeBreakfast是在pig上调用的,它在依赖关系中是有意义的。然而,在这个伪示例中,每当chicken发生变化时,我们也想用pig做早餐(我不知道为什么,这只是一个示例!(。我们本质上是在监听chicken的变化,即使它不涉及makeBreakfast函数。

useEffect(() => {
if(breakfastMadeRef.current) {
farmerFed.current = true;
}
}, [farmerIndex])

在这个例子中,没有实际的依赖关系,但我们确实想检查/更改farmerIndex更改时的引用(同样,只是一个伪例子(。

这种"额外"的依赖有什么后果吗?正如我所期望的(从文档和我看到/使用过useEffect的其他地方(,所有依赖项都将在effect函数的主体中使用,这对我来说似乎是不干净的。

如果我像预期的那样使用规则react-hooks/exhaustive-deps,就不会有任何抱怨。所以我倾向于认为这是可以的,尽管如果我们最终将整个农场添加到依赖项列表中,可能会产生误导/混淆?

没有任何后果,但它通常指示代码气味。

提供给CCD_ 9的阵列最好被认为是";该效果与该数据"同步";而是";每当该数据改变时运行该效果";。如果效果实际上没有使用提供给它的数据,那么当它发生变化时,就不需要重新运行。

通常,提供给useEffect()的无关变量最终要么是派生状态,要么变量变化是由一个函数触发的,该函数本身应该是突变的来源。

如果没有一个更具体的例子,很难说什么;你选择的例子不太可能出现在现实世界中。

接受的答案不正确。useEffect数组中的额外依赖项将导致在它们更改时激发效果,无论它们是否在回调中使用。您可以尝试以下组件,您可以看到每次单击按钮时console.log((都会打印出来,即使其中没有使用依赖项:

import { useEffect, useState } from "react";
export default function App() {
const [toggle, setToggle] = useState(false);
useEffect(() => {
console.log("Toggled"); // Will print everytime when toggle changes
}, [toggle]);
return <button onClick={() => setToggle(!toggle)}>Thing</button>;
}

最新更新