我有一个情况,我想记录用户的时间,每当重新加载或关闭一个标签。
我已经写了下面的代码相同。
useEffect(() => {
const cleanup = () => {
deleteAgentLoginDetails(`agentId=${userId.toUpperCase()}`);
agentLogout(`agentId=${userId.toUpperCase()}`);
> };
window.addEventListener('beforeunload', cleanup);
return () => {
window.removeEventListener('beforeunload', cleanup);
> };
[]);
我的API调用被触发了,但一旦我重新加载页面,它也被取消了。
有没有替代品来实现这一点?
下面是网络选项卡的屏幕截图。这就是为什么我可以在刷新后看到日志)。
network call screenshot
1条答案
按热度按时间41ik7eoe1#
问题似乎是在刷新页面时浏览器取消了beforeunload事件。这是因为beforeunload事件旨在允许页面在用户离开页面之前提示用户,但在刷新页面时浏览器会自动取消此事件。
此问题的一个可能解决方案是使用unload事件,而不是beforeunload事件。unload事件是不可取消的,因此即使在刷新页面时也应触发该事件。
下面是如何在代码中使用unload事件的示例:
另一种可能的解决方案是使用beforeunload事件,但使用异步函数调用API(例如使用setTimeout),这样浏览器在调用API之前有时间完成卸载过程。这将允许beforeunload事件完成并触发API调用,即使页面正在刷新。
下面是一个示例,说明如何执行此操作: