fix(admin): 修复后台骨架屏不可见问题

- admin_layout: 移除 (false, _) 分支中的 DelayedSkeleton 包裹,直接渲染
  骨架屏并附加 animate-pulse。DelayedSkeleton 依赖 use_effect 延迟 200ms
  置 visible=true,但 SSR 不执行 effect,导致服务端 HTML 输出空节点;
  hydration 后 checked 又会立即置 true 退出该分支,骨架屏窗口趋近于零。
  去掉后 SSR HTML 直接包含骨架屏,用户在 WASM 加载 + 身份校验期间可见。

- comments: loading 初始值从 false 改为 true,与 use_paginated hook 保持
  一致。旧值导致首帧 loading()=false,骨架屏条件永远不满足。
This commit is contained in:
xfy 2026-07-08 18:20:25 +08:00
parent 3eaf330673
commit 53de550d7c
2 changed files with 7 additions and 9 deletions

View File

@ -8,7 +8,7 @@ use dioxus::router::components::Link;
use crate::api::auth::{get_current_user, logout}; use crate::api::auth::{get_current_user, logout};
use crate::components::admin_skeleton::AdminDashboardSkeleton; use crate::components::admin_skeleton::AdminDashboardSkeleton;
use crate::components::skeletons::delayed_skeleton::DelayedSkeleton;
use crate::components::write_skeleton::WriteSkeleton; use crate::components::write_skeleton::WriteSkeleton;
use crate::context::UserContext; use crate::context::UserContext;
use crate::router::Route; use crate::router::Route;
@ -155,8 +155,7 @@ pub fn AdminLayout() -> Element {
div { class: "flex-1 flex flex-col min-w-0 h-screen p-2 md:p-4", div { class: "flex-1 flex flex-col min-w-0 h-screen p-2 md:p-4",
div { class: "flex-1 bg-[var(--color-paper-theme)] rounded-[2rem] shadow-sm border border-[var(--color-paper-border)] overflow-hidden relative flex flex-col", div { class: "flex-1 bg-[var(--color-paper-theme)] rounded-[2rem] shadow-sm border border-[var(--color-paper-border)] overflow-hidden relative flex flex-col",
main { class: "{main_class}", main { class: "{main_class}",
DelayedSkeleton { div { class: "p-10 animate-pulse",
div { class: "p-10",
{ {
match route { match route {
Route::Write {} => rsx! { WriteSkeleton {} }, Route::Write {} => rsx! { WriteSkeleton {} },
@ -172,4 +171,3 @@ pub fn AdminLayout() -> Element {
} }
} }
} }
}

View File

@ -67,7 +67,7 @@ pub fn AdminCommentsPage(page: i32) -> Element {
let mut comments: Signal<Vec<AdminComment>> = use_signal(Vec::new); let mut comments: Signal<Vec<AdminComment>> = use_signal(Vec::new);
let mut total: Signal<i64> = use_signal(|| 0); let mut total: Signal<i64> = use_signal(|| 0);
#[allow(unused_mut)] #[allow(unused_mut)]
let mut loading: Signal<bool> = use_signal(|| false); let mut loading: Signal<bool> = use_signal(|| true);
#[allow(unused_mut)] #[allow(unused_mut)]
let mut error: Signal<Option<String>> = use_signal(|| None); let mut error: Signal<Option<String>> = use_signal(|| None);