【发布时间】:2022-01-11 07:54:38
【问题描述】:
每次我使用addEventListener(),并且还想访问useEffect 中的某些状态时,我都会遇到同样的问题。我不能将状态添加为依赖项,因为每次状态更改时我都会创建多个事件侦听器。
我几乎每次都发现自己被“React Hook useEffect has a missing dependency”警告卡住了。
假设我有一个组件需要在window.onClick() 和window.onDoubleClick() 上更改它的状态。如果状态为真,单击应将其更改为假,如果状态为假,双击应将其更改为真。
所以这就是我要写的:
import React, { useState, useEffect } from 'react';
export default function someComponent() {
const [toggle, setToggle] = useState(false);
useEffect(() => {
window.addEventListener('click', (event) => {
if (toggle) setToggle(false)
})
window.addEventListener('dblclick', (event) => {
if (!toggle) setToggle(true)
})
}, [])
return (
<p>The toggle state is {toggle.toString()}</p>
);
}
此代码有效,但我收到缺少依赖项警告。我无法将切换添加到依赖数组,因为这样每次toggle 状态更改时它都会添加另一个事件侦听器。
我在这里做错了什么?我该如何解决这个问题?
编辑:也许这个例子不太好,但它是我能想到的最简单的。但是,这个问题也适用于当我创建其他事件侦听器时,这些侦听器必须在 windows 对象上,比如滚动。我知道我可以每次都使用 return 来删除事件侦听器,但是对于像滚动这样的事件,它会慢得多。每次我都必须删除并添加它对我来说没有意义,因为我只是不需要它再次触发。
【问题讨论】:
-
这就是
useEffect依赖数组的工作原理。如果你在useEffect中访问state,那么它也必须出现在依赖数组中。您可以在useEffect之外创建一个单独的函数,然后在useEffect内部调用它。
标签: javascript reactjs event-handling use-effect use-state