If a user leaves your application and returns to stale data, React Query automatically requests fresh data for you in the background. You can disable this globally or per-query using the refetchOnWindowFocus
option:
//const queryClient = new QueryClient({defaultOptions: {queries: {refetchOnWindowFocus: false,},},})function App() {return <QueryClientProvider client={queryClient}>...</QueryClientProvider>}
useQuery('todos', fetchTodos, { refetchOnWindowFocus: false })
In rare circumstances, you may want to manage your own window focus events that trigger React Query to revalidate. To do this, React 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:
focusManager.setEventListener(handleFocus => {// Listen to visibillitychange and focusif (typeof window !== 'undefined' && window.addEventListener) {window.addEventListener('visibilitychange', handleFocus, false)window.addEventListener('focus', handleFocus, false)}return () => {// Be sure to unsubscribe if a new handler is setwindow.removeEventListener('visibilitychange', handleFocus)window.removeEventListener('focus', handleFocus)}})
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:
import { focusManager } from 'react-query'import onWindowFocus from './onWindowFocus' // The gist abovefocusManager.setEventListener(onWindowFocus) // Boom!
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":
import { AppState } from 'react-native'import { focusManager } from 'react-query'focusManager.setEventListener(setFocus => {const handleAppStateChange = appState => {setFocus(appState === 'active')}AppState.addEventListener('change', handleAppStateChange)return () => {AppState.removeEventListener('change', handleAppStateChange)}})
import { focusManager } from 'react-query'// Override the default focus statefocusManager.setFocused(true)// Fallback to the default focus checkfocusManager.setFocused(undefined)
The latest TanStack news, articles, and resources, sent to your inbox.