reactjs - 使用 eventListener 增加值
问题描述
鉴于:
export default function ComponentA(props) {
const [x, setX] = useState(0)
useEffect(() => {
connect("http://localhost:18200/events/agg/dotusd");
})
const connect = (url) => {
const es = new EventSource(url, { withCredentials: false });
es.addEventListener('heartBeat', handleHeartBeat);
};
const handleHeartBeat = (event) => {
setX((x) => x + 1)
const currentdate = new Date();
const datetime = " "
+ currentdate.getHours() + ":"
+ currentdate.getMinutes() + ":"
+ currentdate.getSeconds();
console.log("time =", datetime + "; x =", x)
}
return (
<div>
<ComponentB key='1' x={x} />
</div>
);
}
何时:heartbeat
事件发生。
然后:增加x
值并将其记录到控制台,因此:
1
2
3
4
...
结果:它做了一个奇怪的递归:
0
0 1
0 1 2
0 1 2 3
...
为什么以及如何解决它?
解决方案
添加一个空数组作为useEffect
. 这告诉 react 只在组件安装时运行该代码一次。目前,每次该组件重新渲染时,都会添加另一个事件侦听器。
useEffect(() => {
connect("http://localhost:18200/events/agg/dotusd");
}, [])
推荐阅读
- three.js - ThreeJS:如何导入 PositionalAudioHelper?
- css - 滚动条不再出现
- python - 在不重复字符的情况下优化最长子串的蛮力方法
- html - Boostrap html 表格,添加了很多东西
- javascript - 首选哪种 Javascript 闭包场景?
- c - Gtk3:GMenu/GMenuItem:如何感知是否打开了子菜单?(子菜单的信号)
- flutter - 如何在颤动中为地图标记设置动画?
- python - Python - 删除网表文件中的最后一个字符
- ruby - 系统 Ruby 安装没有 GEM_HOME
- linux - 将 Jmeter(windows) 与 VM (Linux) 连接起来