// 为什么即使我这么写,每次点击修改list数据时候,点击事件也只会触发一次呢。
// 每次render的时候,handlerFn不是都重新生成了吗,而且每次修改list数据时候,不是都重新执行了一次window.addEventListener('click', handlerFn);吗
export default () => {
const [data, setData] = useState([]);
const handlerFn = () => {
console.log('触发了事件~~~');
};
useEffect(() => {
window.addEventListener('click', handlerFn);
return () => {
window.removeEventListener('click', handlerFn);
};
}, [data]);
return (
<div>
<div onClick={() => {
setData([{age: new Date()}]);
}}>
点击修改data数据
</div>
</div>
);
};
在组件每次重新渲染前,React 会首先执行 cleanup 函数(useEffect 返回的函数)。
在你的代码中,cleanup 函数会移除上一次的监听事件,自然就不会重复执行监听事件了。