fix(admin): 后台列表切换保留当前内容,去掉加载占位
用户档案、用户列表、内容筛选与公告页等数据到达后再换视图,避免滚动条闪动。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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, "");
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user