diff --git a/apps/web/src/shared/composables/pagination.ts b/apps/web/src/shared/composables/pagination.ts index 6b14b04..e96524e 100644 --- a/apps/web/src/shared/composables/pagination.ts +++ b/apps/web/src/shared/composables/pagination.ts @@ -49,7 +49,14 @@ export function usePagination>( // 同步其他查询参数 Object.keys(initialQuery).forEach((key) => { const value = route.query[key] - if (value !== undefined) { + if (value === undefined) { + // 地址里没有这一项(后退到不带筛选的地址、点顶栏回到列表)就是没筛, + // 不能留着上一个地址的值:后退回 /problem 页面还停在上一个知识点。 + // 和 clearQuery 一样清成空值 —— initialQuery 是进页面时从地址读的,不一定是空的 + const initialValue = initialQuery[key] + writable[key] = + typeof initialValue === "boolean" ? false : typeof initialValue === "number" ? 0 : "" + } else { // 处理不同类型的参数 if (typeof initialQuery[key] === "boolean") { writable[key] = value === "1" || value === "true" @@ -65,7 +72,21 @@ export function usePagination>( // 更新 URL function updateRoute() { const newQuery = filterEmptyValue(query) - router.push({ + // 和当前地址只差默认的 page / limit(后退到 /problem,同步完又补上 ?page=1&limit=30): + // 是同一个页面,用 replace,别多压一条历史、让人得多按一次后退 + const normalized = (q: Record) => + JSON.stringify( + Object.entries(q) + .filter(([key, value]) => { + if (key === "page") return String(value) !== String(defaultPage) + if (key === "limit") return String(value) !== String(defaultLimit) + return value != null && value !== "" + }) + .map(([key, value]) => [key, String(value)]) + .sort(), + ) + const navigate = normalized(route.query) === normalized(newQuery) ? router.replace : router.push + navigate({ path: route.path, query: newQuery, })