If a user leaves your application and returns and the query data is stale,
TanStack Query automatically requests fresh data for you in the background
. You can disable this globally or per-query using the
refetchOnWindowFocus
option:
Disabling Globally
tsx
const queryClient = new QueryClient({
defaultOptions: {
queries: {
refetchOnWindowFocus: false,
},
},
})
function App() {
return <QueryClientProvider client={queryClient}>...</QueryClientProvider>
}
Disabling Per-Query
tsx
useQuery({
queryKey: ['todos'],
queryFn: fetchTodos,
refetchOnWindowFocus: false,
})
Custom Window Focus Event
In rare circumstances, you may want to manage your own window focus events that trigger TanStack Query to revalidate. To do this, TanStack Query provides a
focusManager.setEventListener
function that supplies you the callback that should be fired when the window is focused and allows you to set up your own events. When calling
focusManager.setEventListener
, the previously set handler is removed (which in most cases will be the default handler) and your new handler is used instead. For example, this is the default handler:
tsx
focusManager.setEventListener((handleFocus) => {
if (typeof window !== 'undefined' && window.addEventListener) {
window.addEventListener('visibilitychange', handleFocus, false)
window.addEventListener('focus', handleFocus, false)
}
return () => {
window.removeEventListener('visibilitychange', handleFocus)
window.removeEventListener('focus', handleFocus)
}
})
Ignoring Iframe Focus Events
A great use-case for replacing the focus handler is that of iframe events. Iframes present problems with detecting window focus by both double-firing events and also firing false-positive events when focusing or using iframes within your app. If you experience this, you should use an event handler that ignores these events as much as possible. I recommend
this one
! It can be set up in the following way:
tsx
import { focusManager } from '@tanstack/react-query'
import onWindowFocus from './onWindowFocus'
focusManager.setEventListener(onWindowFocus)
Managing Focus in React Native
Instead of event listeners on
window
, React Native provides focus information through the
AppState
module
. You can use the
AppState
"change" event to trigger an update when the app state changes to "active":
tsx
import { AppState } from 'react-native'
import { focusManager } from '@tanstack/react-query'
function onAppStateChange(status: AppStateStatus) {
if (Platform.OS !== 'web') {
focusManager.setFocused(status === 'active')
}
}
useEffect(() => {
const subscription = AppState.addEventListener('change', onAppStateChange)
return () => subscription.remove()
}, [])