fix(admin): 后台列表切换保留当前内容,去掉加载占位

用户档案、用户列表、内容筛选与公告页等数据到达后再换视图,避免滚动条闪动。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-17 00:57:54 +08:00
parent a0a9aeed66
commit 442af625f6
7 changed files with 213 additions and 100 deletions

View File

@@ -1,6 +1,6 @@
"use client";
import { useCallback, useEffect, useState } from "react";
import { useCallback, useEffect, useRef, useState } from "react";
import Link from "next/link";
import {
Check,
@@ -153,6 +153,7 @@ export default function ContentAdmin({
const [appliedQ, setAppliedQ] = useState("");
const [loading, setLoading] = useState(false);
const [error, setError] = useState(initError);
const loadSeq = useRef(0);
const [actingKey, setActingKey] = useState<string | null>(null);
const [trustOn, setTrustOn] = useState(initialSettings.trust_reviewed_publish);
@@ -178,34 +179,44 @@ export default function ContentAdmin({
}, []);
const loadPosts = useCallback(async (page: number, st: AdminContentStatus, q: string) => {
const seq = ++loadSeq.current;
setLoading(true);
try {
const res = await apiAdminContentPosts(page, st, q);
if (seq !== loadSeq.current) return;
setPosts(res.posts);
setPostsTotal(res.total);
setPostsPage(page);
setKind("posts");
setStatus(st);
setAppliedQ(q);
setError("");
} catch (e) {
if (seq !== loadSeq.current) return;
setError(e instanceof Error ? e.message : "获取帖子失败");
} finally {
setLoading(false);
if (seq === loadSeq.current) setLoading(false);
}
}, []);
const loadComments = useCallback(async (page: number, st: AdminContentStatus, q: string) => {
const seq = ++loadSeq.current;
setLoading(true);
try {
const res = await apiAdminContentComments(page, st, q);
if (seq !== loadSeq.current) return;
setComments(res.comments);
setCommentsTotal(res.total);
setCommentsPage(page);
setKind("comments");
setStatus(st);
setAppliedQ(q);
setError("");
} catch (e) {
if (seq !== loadSeq.current) return;
setError(e instanceof Error ? e.message : "获取评论失败");
} finally {
setLoading(false);
if (seq === loadSeq.current) setLoading(false);
}
}, []);
@@ -239,7 +250,6 @@ export default function ContentAdmin({
const switchStatus = (st: AdminContentStatus) => {
if (st === status) return;
setStatus(st);
setError("");
if (kind === "posts") void loadPosts(1, st, appliedQ);
else void loadComments(1, st, appliedQ);
@@ -247,13 +257,12 @@ export default function ContentAdmin({
const applySearch = () => {
const q = keyword.trim();
setAppliedQ(q);
if (kind === "posts") void loadPosts(1, status, q);
else void loadComments(1, status, q);
};
const clearSearch = () => {
setAppliedQ("");
setKeyword("");
if (kind === "posts") void loadPosts(1, status, "");
else void loadComments(1, status, "");
};