问题摘要:setTimeout
使用React的useEffect
挂钩时,无法在移动设备上清除。但是,它们正在桌面上清除。
问题再现:https : //codepen.io/amliving/pen/QzmPYE。
注意:请在移动设备上运行以重现该问题。
我的问题:为什么我的解决方案(如下所述)有效?
详细信息:我正在创建一个自定义钩子以检测空闲状态。叫它useDetectIdle
。它会动态地window
从一组事件中添加和删除事件侦听器,这些事件侦听器在触发一段时间后会通过调用提供的回调setTimeout
。
这是将动态添加到事件,然后从中删除的事件的列表window
:
const EVENTS = [
"scroll",
"keydown",
"keypress",
"touchstart",
"touchmove",
"mousedown", /* removing 'mousedown' for mobile devices solves the problem */
];
Run Code Online (Sandbox Code Playgroud)
这是useDetectIdle
钩子。此处的重要之处在于,此钩子在其调用组件卸载时应清除所有现有的超时(并删除所有事件侦听器):
const useDetectIdle = (inactivityTimeout, onIdle) => {
const timeoutRef = useRef(null);
const callbackRef = useRef(onIdle);
useEffect(() => {
callbackRef.current = onIdle;
});
const reset = () => {
if (timeoutRef.current) …
Run Code Online (Sandbox Code Playgroud) 自将iPad升级到iOS 13.2之后,已“添加到主屏幕”并处于“引导访问”模式的网站会显示一个永久的地址/工具栏。我们有适当的meta
标签,即
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="mobile-web-app-capable" content="yes" />
Run Code Online (Sandbox Code Playgroud)
但仍然看到地址/工具栏:
任何见识将不胜感激。