router.rs 2.2 KB

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