diff --git a/src/components/ty-crud.vue b/src/components/ty-crud.vue index f6e0384..ac9ef93 100644 --- a/src/components/ty-crud.vue +++ b/src/components/ty-crud.vue @@ -173,13 +173,20 @@ watch([page, pageSize], () => { }) function handleSearch(): void { - page.value = 1 - fetchList() + resetAndFetch() } function handleReset(): void { - page.value = 1 - fetchList() + resetAndFetch() +} + +/** 重置到第一页并查询:page 已是 1 时 watch 不触发,需手动查询,避免重复请求。 */ +function resetAndFetch(): void { + if (page.value === 1) { + fetchList() + } else { + page.value = 1 + } } async function openCreate(): Promise { diff --git a/src/composables/useRequest.ts b/src/composables/useRequest.ts index 2239eef..c0144a1 100644 --- a/src/composables/useRequest.ts +++ b/src/composables/useRequest.ts @@ -47,10 +47,12 @@ export function useRequest( let lastParams: TParams = defaultParams let controller: AbortController | null = null + let seq = 0 async function run(...args: TParams): Promise { controller?.abort() controller = new AbortController() + const mySeq = ++seq lastParams = args.length > 0 ? args : lastParams loading.value = true @@ -59,16 +61,18 @@ export function useRequest( try { const result = await fetcher(...lastParams, controller.signal) + if (mySeq !== seq) return undefined // 已被更新的请求取代 data.value = result options.onSuccess?.(result, lastParams) return result } catch (e) { if (isCanceled(e)) return undefined + if (mySeq !== seq) return undefined error.value = e options.onError?.(e, lastParams) return undefined } finally { - loading.value = false + if (mySeq === seq) loading.value = false options.onFinally?.(lastParams) } }