Skip to content

Commit 69b0c98

Browse files
committed
feat: add isRefetching flag
which indicates that a query is fetching, but not loading; useful for background loading spinners that you don't want to display on initial loading because you have a big loading spinner there
1 parent e6da990 commit 69b0c98

File tree

5 files changed

+18
-0
lines changed

5 files changed

+18
-0
lines changed

docs/src/pages/reference/useQuery.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ const {
2020
isPlaceholderData,
2121
isPreviousData,
2222
isRefetchError,
23+
isRefetching,
2324
isStale,
2425
isSuccess,
2526
refetch,
@@ -218,6 +219,9 @@ const result = useQuery({
218219
- `isFetching: boolean`
219220
- Is `true` whenever a request is in-flight, which includes initial `loading` as well as background refetches.
220221
- Will be `true` if the query is currently fetching, including background fetching.
222+
- `isRefetching: boolean`
223+
- Is `true` whenever a background refetch is in-flight, which _does not_ include initial `loading`
224+
- Is the same as `isFetching && !isLoading`
221225
- `failureCount: number`
222226
- The failure count for the query.
223227
- Incremented every time the query fails.

src/core/queryObserver.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,7 @@ export class QueryObserver<
553553
state.dataUpdateCount > queryInitialState.dataUpdateCount ||
554554
state.errorUpdateCount > queryInitialState.errorUpdateCount,
555555
isFetching,
556+
isRefetching: isFetching && status !== 'loading',
556557
isLoadingError: status === 'error' && state.dataUpdatedAt === 0,
557558
isPlaceholderData,
558559
isPreviousData,

src/core/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,7 @@ export interface QueryObserverBaseResult<TData = unknown, TError = unknown> {
279279
isPlaceholderData: boolean
280280
isPreviousData: boolean
281281
isRefetchError: boolean
282+
isRefetching: boolean
282283
isStale: boolean
283284
isSuccess: boolean
284285
refetch: (

src/react/tests/useInfiniteQuery.test.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ describe('useInfiniteQuery', () => {
8787
isPlaceholderData: false,
8888
isPreviousData: false,
8989
isRefetchError: false,
90+
isRefetching: false,
9091
isStale: true,
9192
isSuccess: false,
9293
refetch: expect.any(Function),
@@ -116,6 +117,7 @@ describe('useInfiniteQuery', () => {
116117
isPlaceholderData: false,
117118
isPreviousData: false,
118119
isRefetchError: false,
120+
isRefetching: false,
119121
isStale: true,
120122
isSuccess: true,
121123
refetch: expect.any(Function),

src/react/tests/useQuery.test.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ describe('useQuery', () => {
178178
isPlaceholderData: false,
179179
isPreviousData: false,
180180
isRefetchError: false,
181+
isRefetching: false,
181182
isStale: true,
182183
isSuccess: false,
183184
refetch: expect.any(Function),
@@ -201,6 +202,7 @@ describe('useQuery', () => {
201202
isPlaceholderData: false,
202203
isPreviousData: false,
203204
isRefetchError: false,
205+
isRefetching: false,
204206
isStale: true,
205207
isSuccess: true,
206208
refetch: expect.any(Function),
@@ -254,6 +256,7 @@ describe('useQuery', () => {
254256
isPlaceholderData: false,
255257
isPreviousData: false,
256258
isRefetchError: false,
259+
isRefetching: false,
257260
isStale: true,
258261
isSuccess: false,
259262
refetch: expect.any(Function),
@@ -277,6 +280,7 @@ describe('useQuery', () => {
277280
isPlaceholderData: false,
278281
isPreviousData: false,
279282
isRefetchError: false,
283+
isRefetching: false,
280284
isStale: true,
281285
isSuccess: false,
282286
refetch: expect.any(Function),
@@ -300,6 +304,7 @@ describe('useQuery', () => {
300304
isPlaceholderData: false,
301305
isPreviousData: false,
302306
isRefetchError: false,
307+
isRefetching: false,
303308
isStale: true,
304309
isSuccess: false,
305310
refetch: expect.any(Function),
@@ -819,6 +824,7 @@ describe('useQuery', () => {
819824
'data',
820825
'isFetching',
821826
'isLoading',
827+
'isRefetching',
822828
'isSuccess',
823829
'status',
824830
],
@@ -1155,24 +1161,28 @@ describe('useQuery', () => {
11551161
expect(states[0]).toMatchObject({
11561162
data: undefined,
11571163
isFetching: true,
1164+
isRefetching: false,
11581165
isSuccess: false,
11591166
isStale: true,
11601167
})
11611168
expect(states[1]).toMatchObject({
11621169
data: 1,
11631170
isFetching: false,
1171+
isRefetching: false,
11641172
isSuccess: true,
11651173
isStale: false,
11661174
})
11671175
expect(states[2]).toMatchObject({
11681176
data: 1,
11691177
isFetching: true,
1178+
isRefetching: true,
11701179
isSuccess: true,
11711180
isStale: true,
11721181
})
11731182
expect(states[3]).toMatchObject({
11741183
data: 2,
11751184
isFetching: false,
1185+
isRefetching: false,
11761186
isSuccess: true,
11771187
isStale: false,
11781188
})

0 commit comments

Comments
 (0)