This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
import { useEffect, useRef } from 'react'
|
||||
|
||||
// 页面从后台恢复到前台时调用 refetch (Tauri 移动端/桌面通用, 不引库)
|
||||
// - visibilitychange: Tauri 移动端 (iOS WKWebView / Android WebView) 唯一可靠的前后台机制,
|
||||
// 回前台时 document.visibilityState 必然变为 'visible'
|
||||
// - window focus: 桌面端 (WebView2) 兜底, 部分场景不派发 DOM focus 但原生窗口焦点事件可靠
|
||||
// 用法: const load = useCallback(...); useRefreshOnVisible(load)
|
||||
// 回调通过 ref 持有, effect 只绑定一次, 不随每次渲染重新订阅
|
||||
export default function useRefreshOnVisible(refetch) {
|
||||
const fnRef = useRef(refetch)
|
||||
fnRef.current = refetch
|
||||
|
||||
useEffect(() => {
|
||||
// 回前台时 visibilitychange 与 focus 会接连触发, 用 300ms 窗口节流避免重复请求
|
||||
let lastTs = 0
|
||||
const fire = () => {
|
||||
const now = Date.now()
|
||||
if (now - lastTs < 300) return
|
||||
lastTs = now
|
||||
fnRef.current?.()
|
||||
}
|
||||
const onVisibility = () => {
|
||||
if (document.visibilityState === 'visible') fire()
|
||||
}
|
||||
const onFocus = () => fire()
|
||||
document.addEventListener('visibilitychange', onVisibility)
|
||||
window.addEventListener('focus', onFocus)
|
||||
return () => {
|
||||
document.removeEventListener('visibilitychange', onVisibility)
|
||||
window.removeEventListener('focus', onFocus)
|
||||
}
|
||||
}, [])
|
||||
}
|
||||
Reference in New Issue
Block a user