我有以下功能:
function handleEnterPress(e) {
if (e.keyCode === 13) {
if (value !== "") {
let toAdd = true;
chips.forEach(chip => {
if (chip.value === value) {
toAdd = false;
}
});
if (toAdd) {
let chipsCopy = [...chips, { value, isDisabled: false }];
setChips(chipsCopy);
}
}
setValue("");
}
}
并且我有以下
useEffect
:useEffect(() => {
inputRef.current.addEventListener("keyup", handleEnterPress);
return () =>
inputRef.current.removeEventListener("keyup", handleEnterPress);
}, [value]);
现在反应给我一个警告:
React Hook useEffect缺少依赖项'handleEnterPress'。
当我们在第二个参数数组中添加
handleEnterPress
时,有什么区别? 最佳答案
当我们在第二个参数数组中添加handleEnterPress时,有什么区别?
为了你?没有警告的干净代码。
对于React?正是useEffect
的工作方式。
要删除此警告,您需要将handleEnterPress
添加到useEEfect
的依赖项数组中
useEffect(() => {
inputRef.current.addEventListener("keyup", handleEnterPress);
return () =>
inputRef.current.removeEventListener("keyup", handleEnterPress);
}, [value, handleEnterPress]);
之所以需要它,是因为react无法知道
handleEnterPress
的作用或作用。如果handleEnterPress
是变量并且其值已更改怎么办?如果更改handleEnterPress
,则需要再次“运行”效果,但是,如果仅使用[value]
,则当handleEnterPress
更改时,它不会“运行”。在您的情况下,也许它永远不会改变,但是反应不知道,所以...它告诉您添加为依赖项。例如
1。在
useEffect
中,添加一个事件侦听器。inputRef.current.addEventListener("keyup", handleEnterPress);
但是然后您可以通过某种方式更改
handleEnterPress
的值(很多情况不是您的情况,但这是useEffect
所期望的)而且您在
handleEnterPress
的依赖项中没有useEffect
,因此不会发挥作用。然后
value
发生更改,效果发生清除() => inputRef.current.removeEventListener("keyup", handleEnterPress);
在这一部分中,您将尝试使用新的
handleEnterPress
值删除handleEnterPress
,但第一步中没有使用新值,因此您将尝试删除不存在的事件侦听器。包含旧值的第一个
handleEnterPress
将永远不会被删除。这很糟糕,这就是为什么您需要添加
handleEnterPress
作为依赖项的原因编辑:
当
chips
更改时,handleEnterPress
也会更改,并且由于您没有将handleEnterPress
添加到依赖数组中,因此您将始终具有handleEnterPress
的旧值和chips
的旧值。我的答案中说明了您的情况,即
handleEnterPress
发生变化的情况,但事件侦听器仍具有handleEnterPress
的旧值关于reactjs - 我们可以使用函数作为useEffect中的第二个参数吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56425444/