Skip to main content

Module preview

Module preview 

Source
Expand description

草稿/文章预览页面模块(管理员只读)。 草稿/文章预览页面模块(管理员只读)。

对应路由 /admin/preview/:slug

与公开详情页 crate::pages::post_detail::PostDetail 的关键差异:

  • 取数走 admin-only crate::api::posts::get_post_preview,不做 status = 'published' 过滤, 故草稿可预览;草稿绝不进公开缓存(cache::get/set_post_by_slug)。
  • 顶部渲染预览横幅(状态徽章 + 继续编辑 / 返回列表),便于从预览直达编辑。
  • 错误/未命中就地渲染(admin nest 内无 ErrorBoundary),不向错误边界上抛。
  • 不渲染评论区(草稿无评论)。

§为何预览放在 /admin/*

Dioxus IncrementalRenderer 的 SSR 磁盘缓存按 URL(path_and_query())落盘, 不区分用户身份。若管理员在 /post/<draft-slug> 看到草稿,渲染出的草稿 HTML 会被缓存到 static/post/<draft-slug>/,匿名访客再请求同一 URL 即命中缓存、 直接拿到草稿正文——草稿属保密内容,泄漏不可接受。/admin/preview/<slug>admin_guard 中间件保护:匿名在 SSR 渲染前就被 302 跳走,不产生可泄漏的缓存。

§取数不挂起(与 post_detail.rs 的关键差异,勿“改回去“)

本页不用 use_server_future(...)?(挂起式取数),而是 use_signal + spawn 的非挂起模式(与仪表盘等所有 admin 页一致)。原因:dioxus 0.7.10 存在 vdom 状态腐蚀 bug——当挂起中的 SuspenseBoundary 连同其后台子树一起 卸载(本页从 /admin/preview/* 客户端导航回前台时正是此路径: AdminLayout 的 SuspenseBoundary 在 PostPreview future 尚未 resolve 时被整体 替换),dioxus-core 会对同一元素双重回收(console 报 cannot reclaim ElementId(N)),进而令 interpreter 的节点表失步(RawInterpreter.run 崩溃 Cannot read properties of undefined (reading 'listening')),此后所有点击 事件处理失效(表现为“列表点不动“)。前台页面虽同样挂起,但前台内部导航 不卸载 FrontendLayout 的 boundary,触发不了该路径;admin 侧只有本页挂起。 上游 master 的 suspense 卸载逻辑与 0.7.10 相同(未修复);若日后升级 dioxus 修复了此 bug,可考虑改回挂起式取数以恢复 SSR 数据内嵌。

Re-exports§

pub use PostPreview_completions::Component::PostPreview;

Structs§

PostPreviewProps
Properties for the PostPreview component.

Functions§

PostPreview
草稿/文章预览页面组件(管理员只读),对应路由 /admin/preview/:slug