Skip to content

Commit 66b3198

Browse files
committed
fix: root level refresh, mutate, cancel not work with queryKey #37
1 parent 3362312 commit 66b3198

File tree

2 files changed

+78
-3
lines changed

2 files changed

+78
-3
lines changed

src/__tests__/index.test.tsx

+70
Original file line numberDiff line numberDiff line change
@@ -1342,6 +1342,76 @@ describe('useRequest', () => {
13421342
}
13431343
});
13441344

1345+
test('queryKey should work with root level `cancel`, `mutate`, `refresh`', async () => {
1346+
const users = [
1347+
{ id: '1', username: 'A' },
1348+
{ id: '2', username: 'B' },
1349+
{ id: '3', username: 'C' },
1350+
];
1351+
1352+
const wrapper = shallowMount(
1353+
defineComponent({
1354+
setup() {
1355+
const { run, queries, mutate, refresh, cancel } = useRequest(
1356+
request,
1357+
{
1358+
manual: true,
1359+
refreshOnWindowFocus: true,
1360+
queryKey: id => id,
1361+
},
1362+
);
1363+
1364+
return () => (
1365+
<div>
1366+
<div id="mutate" onClick={() => mutate('new data')} />
1367+
<div id="refresh" onClick={() => refresh()} />
1368+
<div id="cancel" onClick={() => cancel()} />
1369+
<ul>
1370+
{users.map(item => (
1371+
<li
1372+
key={item.id}
1373+
id={item.username}
1374+
onClick={() => run(item.id)}
1375+
>
1376+
{queries[item.id]?.loading
1377+
? 'loading'
1378+
: queries[item.id]?.data}
1379+
</li>
1380+
))}
1381+
</ul>
1382+
</div>
1383+
);
1384+
},
1385+
}),
1386+
);
1387+
1388+
const mutate = () => wrapper.find('#mutate').trigger('click');
1389+
const refresh = () => wrapper.find('#refresh').trigger('click');
1390+
const cancel = () => wrapper.find('#cancel').trigger('click');
1391+
1392+
for (let i = 0; i < users.length; i++) {
1393+
const userName = users[i].username;
1394+
const currentId = users[i].id;
1395+
const userElement = wrapper.find(`#${userName}`);
1396+
await userElement.trigger('click');
1397+
expect(userElement.text()).toBe('loading');
1398+
await waitForTime(1000);
1399+
expect(userElement.text()).toBe(currentId);
1400+
1401+
await mutate();
1402+
expect(userElement.text()).toBe('new data');
1403+
1404+
await userElement.trigger('click');
1405+
expect(userElement.text()).toBe('loading');
1406+
await waitForTime(100);
1407+
await cancel();
1408+
expect(userElement.text()).toBe('new data');
1409+
1410+
await refresh();
1411+
expect(userElement.text()).toBe('loading');
1412+
}
1413+
});
1414+
13451415
test('errorRetry should work. case 1', async () => {
13461416
const wrapper = shallowMount(
13471417
defineComponent({

src/core/useAsyncQuery.ts

+8-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
import createQuery, {
2020
InnerQueryState,
2121
InnerRunReturn,
22+
Mutate,
2223
Query,
2324
QueryState,
2425
State,
@@ -222,6 +223,10 @@ function useAsyncQuery<R, P extends unknown[], FR>(
222223
});
223224
};
224225

226+
const cancel = () => latestQuery.value.cancel();
227+
const refresh = () => latestQuery.value.refresh();
228+
const mutate = <Mutate<R>>((arg: R) => latestQuery.value.mutate(arg));
229+
225230
// initial run
226231
if (!manual) {
227232
initialAutoRunFlag.value = true;
@@ -282,9 +287,9 @@ function useAsyncQuery<R, P extends unknown[], FR>(
282287
data,
283288
error,
284289
params,
285-
cancel: latestQuery.value.cancel,
286-
refresh: latestQuery.value.refresh,
287-
mutate: latestQuery.value.mutate,
290+
cancel,
291+
refresh,
292+
mutate,
288293
run,
289294
reset,
290295
queries,

0 commit comments

Comments
 (0)