fix(题目列表): 切了几个知识点再按后退,地址回到了全部题目、页面还停在上一个知识点

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
xuyueandClaude Opus 5.5 committed 2026-10-09 16:49:09 +08:00
1 parent c3927d522c
commit 50660abf11
1 file changed
+23 -2
+23 -2
View File
@@ -49,7 +49,14 @@ export function usePagination<T extends Record<string, any>>(
// 同步其他查询参数
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<T extends Record<string, any>>(
// 更新 URL
function updateRoute() {
const newQuery = filterEmptyValue(query)
router.push({
// 和当前地址只差默认的 page / limit(后退到 /problem,同步完又补上 ?page=1&limit=30):
// 是同一个页面,用 replace,别多压一条历史、让人得多按一次后退
const normalized = (q: Record<string, unknown>) =>
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,
})