router.rs 2.2 KB

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