Skip to content

Commit 2d7803f

Browse files
fix: falsy query key clears resolvedData in usePaginatedQuery (TanStack#482)
* Add clearOnNoQuery to usePaginatedQuery * Change: make clearOnNoQuery the default Co-authored-by: Ben Farr <ben.farr@marmalade.co.uk>
1 parent 65543e5 commit 2d7803f

File tree

2 files changed

+64
-0
lines changed

2 files changed

+64
-0
lines changed

src/tests/usePaginatedQuery.test.js

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,4 +121,64 @@ describe('usePaginatedQuery', () => {
121121
expect(rendered.getByTestId('status').textContent).toBe('success')
122122
expect(rendered.getByTestId('status').textContent).not.toBe('loading')
123123
})
124+
125+
it('should clear resolvedData data when query is falsy', async () => {
126+
function Page() {
127+
const [searchTerm, setSearchTerm] = React.useState('')
128+
const [page, setPage] = React.useState(1)
129+
const { resolvedData = 'undefined' } = usePaginatedQuery(
130+
searchTerm && ['data', searchTerm, page],
131+
async (queryName, searchTerm, page) => {
132+
await sleep(1)
133+
return `${searchTerm} ${page}`
134+
}
135+
)
136+
137+
return (
138+
<div>
139+
<h1 data-testid="title">Data {resolvedData}</h1>
140+
<input
141+
name="searchTerm"
142+
placeholder="Enter a search term"
143+
value={searchTerm}
144+
onChange={e => setSearchTerm(e.currentTarget.value)}
145+
/>
146+
<button
147+
onClick={() => {
148+
setSearchTerm('')
149+
setPage(1)
150+
}}
151+
>
152+
clear
153+
</button>
154+
<button onClick={() => setPage(page + 1)}>next</button>
155+
</div>
156+
)
157+
}
158+
159+
const rendered = render(<Page />)
160+
161+
fireEvent.change(rendered.getByPlaceholderText('Enter a search term'), {
162+
target: { value: 'first-search' },
163+
})
164+
rendered.getByText('Data undefined')
165+
await waitForElement(() => rendered.getByText('Data first-search 1'))
166+
167+
fireEvent.click(rendered.getByText('next'))
168+
rendered.getByText('Data first-search 1')
169+
await waitForElement(() => rendered.getByText('Data first-search 2'))
170+
171+
fireEvent.click(rendered.getByText('clear'))
172+
rendered.getByText('Data undefined')
173+
174+
fireEvent.change(rendered.getByPlaceholderText('Enter a search term'), {
175+
target: { value: 'second-search' },
176+
})
177+
rendered.getByText('Data undefined')
178+
await waitForElement(() => rendered.getByText('Data second-search 1'))
179+
180+
fireEvent.click(rendered.getByText('next'))
181+
rendered.getByText('Data second-search 1')
182+
await waitForElement(() => rendered.getByText('Data second-search 2'))
183+
})
124184
})

src/usePaginatedQuery.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ export function usePaginatedQuery(...args) {
1010

1111
const lastDataRef = React.useRef()
1212

13+
if (!queryKey) {
14+
lastDataRef.current = undefined
15+
}
16+
1317
// If latestData is set, don't use initialData
1418
if (typeof lastDataRef.current !== 'undefined') {
1519
delete config.initialData

0 commit comments

Comments
 (0)