router.rs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. use dioxus::prelude::*;
  2. use dioxus_router::prelude::*;
  3. fn main() {
  4. launch_desktop(Route::Home {});
  5. }
  6. #[derive(Routable, Clone, Debug, PartialEq)]
  7. #[rustfmt::skip]
  8. enum Route {
  9. #[layout(NavBar)]
  10. #[route("/")]
  11. Home {},
  12. #[nest("/blog")]
  13. #[layout(Blog)]
  14. #[route("/")]
  15. BlogList {},
  16. #[route("/:name")]
  17. BlogPost { name: String },
  18. #[end_layout]
  19. #[end_nest]
  20. #[end_layout]
  21. #[nest("/myblog")]
  22. #[redirect("/", || Route::BlogList {})]
  23. #[redirect("/:name", |name: String| Route::BlogPost { name })]
  24. #[end_nest]
  25. #[route("/:..route")]
  26. PageNotFound {
  27. route: Vec<String>,
  28. },
  29. }
  30. #[component]
  31. fn NavBar() -> Element {
  32. rsx! {
  33. nav {
  34. ul {
  35. li {
  36. Link { to: Route::Home {}, "Home" }
  37. }
  38. li {
  39. Link { to: Route::BlogList {}, "Blog" }
  40. }
  41. }
  42. }
  43. Outlet::<Route> {}
  44. }
  45. }
  46. #[component]
  47. fn Home() -> Element {
  48. println!("Home");
  49. rsx! { h1 { "Welcome to the Dioxus Blog!" } }
  50. }
  51. #[component]
  52. fn Blog() -> Element {
  53. println!("Blog");
  54. rsx! {
  55. h1 { "Blog" }
  56. Outlet::<Route> {}
  57. }
  58. }
  59. #[component]
  60. fn BlogList() -> Element {
  61. rsx! {
  62. h2 { "Choose a post" }
  63. ul {
  64. li {
  65. Link {
  66. to: Route::BlogPost {
  67. name: "Blog post 1".into(),
  68. },
  69. "Read the first blog post"
  70. }
  71. }
  72. li {
  73. Link {
  74. to: Route::BlogPost {
  75. name: "Blog post 2".into(),
  76. },
  77. "Read the second blog post"
  78. }
  79. }
  80. }
  81. }
  82. }
  83. #[component]
  84. fn BlogPost(name: String) -> Element {
  85. rsx! { h2 { "Blog Post: {name}" } }
  86. }
  87. #[component]
  88. fn PageNotFound(route: Vec<String>) -> Element {
  89. rsx! {
  90. h1 { "Page not found" }
  91. p { "We are terribly sorry, but the page you requested doesn't exist." }
  92. pre { color: "red", "log:\nattemped to navigate to: {route:?}" }
  93. }
  94. }