Skip to main content

yggdrasil/components/post/
post_footer.rs

1//! 文章页脚组件。
2//! 展示文章标签与上一篇/下一篇导航。
3
4use dioxus::prelude::*;
5use dioxus::router::components::Link;
6
7use crate::components::post::post_nav_links::PostNavLinks;
8use crate::models::post::Post;
9use crate::router::Route;
10
11/// 文章页脚组件。
12///
13/// Props:
14/// - `post`:文章数据模型
15/// - `full_reload`:链接走整页加载而非客户端路由(默认 false)。仅当本组件
16///   渲染在 admin 布局内(`/admin/preview`)时传 true——跨 layout 分支的
17///   客户端导航会触发 dioxus 0.7.10 的 suspense 卸载双重回收 bug(详见
18///   `src/pages/admin/preview.rs` 模块文档),整页加载可完全规避。
19///
20/// 展示内容包括:
21/// - 文章标签云,链接到对应标签详情页
22/// - 相邻文章导航(如有)
23#[component]
24pub fn PostFooter(post: Post, #[props(default = false)] full_reload: bool) -> Element {
25    let tag_to = |tag: &str| {
26        super::nav_target(
27            Route::TagDetail {
28                tag: tag.to_string(),
29            },
30            full_reload,
31        )
32    };
33    rsx! {
34        footer { class: "post-footer",
35            if !post.tags.is_empty() {
36                ul { class: "post-tags",
37                    for tag in &post.tags {
38                        li { key: "{tag}",
39                            Link {
40                                to: tag_to(tag),
41                                "{tag}"
42                            }
43                        }
44                    }
45                }
46            }
47
48            if post.prev_post.is_some() || post.next_post.is_some() {
49                PostNavLinks { prev: post.prev_post, next: post.next_post, full_reload }
50            }
51        }
52    }
53}