假设我有这个代码:
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>;
}