視窗焦點重新獲取

如果使用者離開您的應用程式後返回,且查詢資料已過時,TanStack Query 會自動在背景為您請求新資料。您可以使用 refetchOnWindowFocus 選項全域或針對單一查詢停用此功能:

全域停用

ts
export const appConfig: ApplicationConfig = {
  providers: [
    provideTanStackQuery(
      new QueryClient({
        defaultOptions: {
          queries: {
            refetchOnWindowFocus: false, // default: true
          },
        },
      }),
    ),
  ],
}
export const appConfig: ApplicationConfig = {
  providers: [
    provideTanStackQuery(
      new QueryClient({
        defaultOptions: {
          queries: {
            refetchOnWindowFocus: false, // default: true
          },
        },
      }),
    ),
  ],
}

單一查詢停用

ts
injectQuery(() => ({
  queryKey: ['todos'],
  queryFn: fetchTodos,
  refetchOnWindowFocus: false,
}))
injectQuery(() => ({
  queryKey: ['todos'],
  queryFn: fetchTodos,
  refetchOnWindowFocus: false,
}))

自訂視窗焦點事件

在極少數情況下,您可能需要自行管理觸發 TanStack Query 重新驗證的視窗焦點事件。為此,TanStack Query 提供了 focusManager.setEventListener 函式,該函式會提供一個在視窗獲得焦點時應觸發的回呼函式,並允許您設定自己的事件。呼叫 focusManager.setEventListener 時,先前設定的處理常式會被移除(在大多數情況下會是預設處理常式),並改用您的新處理常式。例如,以下是預設處理常式:

tsx
focusManager.setEventListener((handleFocus) => {
  // 監聽 visibilitychange 事件
  if (typeof window !== 'undefined' && window.addEventListener) {
    const visibilitychangeHandler = () => {
      handleFocus(document.visibilityState === 'visible')
    }
    window.addEventListener('visibilitychange', visibilitychangeHandler, false)
    return () => {
      // 確保在設定新處理常式時取消訂閱
      window.removeEventListener('visibilitychange', visibilitychangeHandler)
    }
  }
})
focusManager.setEventListener((handleFocus) => {
  // 監聽 visibilitychange 事件
  if (typeof window !== 'undefined' && window.addEventListener) {
    const visibilitychangeHandler = () => {
      handleFocus(document.visibilityState === 'visible')
    }
    window.addEventListener('visibilitychange', visibilitychangeHandler, false)
    return () => {
      // 確保在設定新處理常式時取消訂閱
      window.removeEventListener('visibilitychange', visibilitychangeHandler)
    }
  }
})

管理焦點狀態

tsx
import { focusManager } from '@tanstack/angular-query-experimental'

// 覆蓋預設的焦點狀態
focusManager.setFocused(true)

// 回退到預設的焦點檢查
focusManager.setFocused(undefined)
import { focusManager } from '@tanstack/angular-query-experimental'

// 覆蓋預設的焦點狀態
focusManager.setFocused(true)

// 回退到預設的焦點檢查
focusManager.setFocused(undefined)