import React, { useEffect } from "react";
// User has switched back to the tab
const onFocus = () => {
console.log("Tab is in focus");
};
// User has switched away from the tab (AKA tab is hidden)
const onBlur = () => {
console.log("Tab is blurred");
};
const WindowFocusHandler = () => {
useEffect(() => {
window.addEventListener("focus", onFocus);
window.addEventListener("blur", onBlur);
// Calls onFocus when the window first loads
onFocus();
// Specify how to clean up after this effect:
return () => {
window.removeEventListener("focus", onFocus);
window.removeEventListener("blur", onBlur);
};
}, []);
return <></>;
};
export default WindowFocusHandler;
8条答案
按热度按时间xuo3flqw1#
从React 16.8开始,使用钩子构建了这个
2023年5月编辑:
有一个新的
visibilitychange
事件对移动的web标签有more nuanced行为,如果你需要不同的行为来显示移动用户浏览他们的web标签和切换到不同的标签,你可以使用这个事件API,如下面更多的回答所述。pvcm50d12#
这应该行得通:
编辑:同样的“模糊”,它应该工作时,标签成为隐藏。
检查@Assaf的答案,了解钩子的用法。
iih3973s3#
没有可靠的方法来检查它,所以你需要把几个方法组合在一起。
yacmzcpb4#
我找到了This library。可能会有帮助。
以下是我将如何使用它来解决您的问题
tjvv9vkg5#
现代钩:
用法:
此挂接使用Document.visibilityState
5lwkijsr6#
这些都不能很好地满足我的需要,这是一种检测用户是否在选项卡之间切换的方法,或者通过双击任务栏中的图标来最小化浏览器。
他们要么发射了多次,但没有管理注册正确的状态,没有工作时,最小化从任务栏图标或只是没有设法跟上多个行动一个接一个。
鉴于每次焦点改变时我都需要发出服务器请求,上述情况有点“不”。
这就是我所做的
目前这似乎工作得很好,在Chrome和Firefox上都进行了测试,你所需要做的就是在一个主组件中或任何你需要的地方初始化它,它将跟踪所有这些场景的窗口焦点,它将只对每个操作发出一个服务器请求。
5w9g7ksd7#
更完整、更优化的钩子:
gj3fmq9x8#
我认为查看
document.visibilityState
的直接状态更简单,因为它返回'visible'
或'hidden'
: