function Example() {
const [stateA, stateA] = useState(0);
const [stateB, stateB] = useState(0);
useEffect(() => {
// this calculation should only be trigged by the change of stateA
// but it somehow uses the stateB for calculation
const calculation = () => {
console.log(stateB);
};
calculation();
}, [stateA]);
return null;
}
根据https://overreacted.io/a-complete-guide-to-useeffect/的指南,我想知道在这种情况下设置依赖项的正确方法是什么
答案 0 :(得分:0)
如果您正在组件中使用计算结果,这听起来像是useCallback
hook的一个好用例。
const someResult = useCallback(() => {
return doSomething(stateB);
}, [stateA])
如果您只想运行一些随机效果,那么useEffect
是正确的。您只需要在依赖项数组中指定stateA
。
useEffect(() => {
doSomething(stateB);
}, [stateA])
如果您使用exhaustive-deps
掉毛规则,则在两种情况下都会发出警告。这是因为您记忆的计算依赖于stateB
,但是在stateB
更新时不会重新计算,这意味着您的计算可能是过时的。您有两种选择:
stateB
添加到依赖项数组中(您的计算将在更新stateA
或stateB
时进行。// eslint-disable-next-line react-hooks/exhaustive-deps
传统的智慧是,抑制此警告会再次咬住您,因此可能值得一试的是,如果不进行这种过时的计算,是否可以完成所需的工作。