react-query guide - Invalidation

1. Query Invalidation Basics

invalidateQuries 는 쿼리를 무효화하고 다시 fetch 데 사용할 수 있다

쿼리를 유효하지 않은 것으로 표시하고 활성화된 쿼리를 background에서 refetch 한다

무효화 시킬 query key를 넣어주면 된다

queryCache.invalidateQueries('random')

2. Invalidation Without Refetching Active Queries

활성화된 쿼리를 refetching 없이 invalidate 시키기

활성화된 쿼리가 refetch 되는 것을 원하지 않고, invalid 된 것으로 표시하고 싶은 경우 사용

아래 예시는 refetchActive: false 로 설정해서 window 에 다시 focus 됐을 때 쿼리를 가져오지 못하는데, Invalidate Random Number 버튼을 클릭하면 query의 상태를 무효화 시켜, window에 다시 focus 하면 refetch 할 수 있다

export default function Posts() {
  const randomQuery = useQuery(
    'random',
    async () => {
      return axios.get('/api/random').then(res => res.data)
    },
    {
      staleTime: Infinity,
    }
  )

  return (
    <div>
      <h1>Random Number {randomQuery.isFetching ? '...' : null}</h1>
      <h2>
        {randomQuery.isLoading
          ? 'Loading random number...'
          : Math.round(randomQuery.data.random * 1000)}
      </h2>
      <div>
        <button
          onClick={() =>
            queryCache.invalidateQueries('random', {
              refetchActive: false,
            })
          }
        >
          Invalidate Random Number
        </button>
      </div>
    </div>
  )
}

3. Invalidating & Refetching Inactive Queries

refetchInactive: true 를 사용하면 비활성화된 쿼리도 다시 가져온다

queryCache.invalidateQueries('random', {
  refetchInactive: true,
})

4. Invalidating Multiple Queries with Similar Query Keys

complex key 를 사용할 때 invalidateQueriesprefix 로 해당하는 쿼리들을 invalidate 시킬 수 있다

ex) queryCache.invalidateQueries('random')['random', subKey] 모두 invalidate

`queryCache.invalidateQueries(['random', 'A'])` → `['random', 'A']` 만 invalidate

여러개의 posts 나 todos 를 관리하는 데 사용하면 좋을 것이라고 한다

export default function App() {
  return (
    <div>
      <button onClick={() => queryCache.invalidateQueries('random')}>
        Invalidate Random Number
      </button>
      <RandomNumber subKey="A" />
      <RandomNumber subKey="B" />
      <RandomNumber subKey="C" />
    </div>
  )
}
const randomQuery = useQuery(
    ['random', subKey],
    async () => {
      return axios.get('/api/random').then(res => res.data)
    },
    {
      staleTime: Infinity,
    }
  )