【发布时间】:2020-11-25 10:46:50
【问题描述】:
我制作了一个自定义挂钩来跟踪基于接收到的套接字事件数量的状态变量。 当我通过发送 10 个同时事件进行测试时,状态变量总数的结果是 6 或 7 或 8,而不是预期的 10。
const useSocketAmountReceivedState = (event: string): number => {
const [total, setTotal] = useState(0);
useEffect(() => {
Socket.on(event, () => {
console.log(total);
setTotal(total + 1);
});
return (): void => {
Socket.off(event);
};
});
return total;
}
运行日志看起来像
0
1
1
2
3
3
4
4
4
5
上面例子中的Socket是围绕websocket实现的。
所以我可以推断总更新速度不够快,但是处理这种行为的最佳模式是什么?
【问题讨论】:
-
我不确定这是否会有所帮助,但请尝试:
setTotal(prevTotal => prevTotal + 1); -
Socket.on 事件必须在 useEffect 函数之外
-
请确保不要在每次渲染时运行 useEffect()。为此,在 useEffect() 中为第二个参数添加一个空数组。
-
感谢@EdsonMagombe 的快速回复,这成功了,你能解释一下为什么吗?是因为
useEffect只会在状态更改后再次“更新”total吗? -
没有。这很简单。每次调用 useEffect 时,您都在创建一个事件 Socket.on。所以你有很多 Socket.on 打印
标签: javascript reactjs typescript sockets react-hooks