router.rs 2.3 KB

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