simple_routes.rs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. #![allow(non_snake_case)]
  2. use dioxus::prelude::*;
  3. use dioxus_router::prelude::*;
  4. use std::str::FromStr;
  5. fn main() {
  6. #[cfg(not(target_arch = "wasm32"))]
  7. dioxus_desktop::launch(root);
  8. #[cfg(target_arch = "wasm32")]
  9. dioxus_web::launch(root);
  10. }
  11. fn root(cx: Scope) -> Element {
  12. render! {
  13. Router {
  14. config: RouterConfiguration {
  15. history: {
  16. #[cfg(not(target_arch = "wasm32"))]
  17. let history = Box::<MemoryHistory::<Route>>::default();
  18. #[cfg(target_arch = "wasm32")]
  19. let history = Box::<WebHistory::<Route>>::default();
  20. history
  21. },
  22. ..Default::default()
  23. }
  24. }
  25. }
  26. }
  27. #[inline_props]
  28. fn UserFrame(cx: Scope, user_id: usize) -> Element {
  29. render! {
  30. pre {
  31. "UserFrame{{\n\tuser_id:{user_id}\n}}"
  32. }
  33. div {
  34. background_color: "rgba(0,0,0,50%)",
  35. "children:"
  36. Outlet {}
  37. }
  38. }
  39. }
  40. #[inline_props]
  41. fn Route1(cx: Scope, user_id: usize, dynamic: usize, query: String, extra: String) -> Element {
  42. render! {
  43. pre {
  44. "Route1{{\n\tuser_id:{user_id},\n\tdynamic:{dynamic},\n\tquery:{query},\n\textra:{extra}\n}}"
  45. }
  46. Link {
  47. target: Route::Route1 { user_id: *user_id, dynamic: *dynamic, query: String::new(), extra: extra.clone() + "." },
  48. "Route1 with extra+\".\""
  49. }
  50. p { "Footer" }
  51. Link {
  52. target: Route::Route3 { dynamic: String::new() },
  53. "Home"
  54. }
  55. }
  56. }
  57. #[inline_props]
  58. fn Route2(cx: Scope, user_id: usize) -> Element {
  59. render! {
  60. pre {
  61. "Route2{{\n\tuser_id:{user_id}\n}}"
  62. }
  63. (0..*user_id).map(|i| rsx!{ p { "{i}" } }),
  64. p { "Footer" }
  65. Link {
  66. target: Route::Route3 { dynamic: String::new() },
  67. "Home"
  68. }
  69. }
  70. }
  71. #[inline_props]
  72. fn Route3(cx: Scope, dynamic: String) -> Element {
  73. let navigator = use_navigator(cx);
  74. let current_route = use_route(cx)?;
  75. let current_route_str = use_ref(cx, String::new);
  76. let parsed = Route::from_str(&current_route_str.read());
  77. let site_map = Route::SITE_MAP
  78. .iter()
  79. .flat_map(|seg| seg.flatten().into_iter())
  80. .collect::<Vec<_>>();
  81. render! {
  82. input {
  83. oninput: move |evt| {
  84. *current_route_str.write() = evt.value.clone();
  85. },
  86. value: "{current_route_str.read()}"
  87. }
  88. "dynamic: {dynamic}"
  89. Link {
  90. target: Route::Route2 { user_id: 8888 },
  91. "hello world link"
  92. }
  93. button {
  94. onclick: move |_| { navigator.push(NavigationTarget::External("https://www.google.com".to_string())); },
  95. "google link"
  96. }
  97. p { "Site Map" }
  98. pre { "{site_map:#?}" }
  99. p { "Dynamic link" }
  100. if let Ok(route) = parsed {
  101. if route != current_route {
  102. render! {
  103. Link {
  104. target: route.clone(),
  105. "{route}"
  106. }
  107. }
  108. }
  109. else {
  110. None
  111. }
  112. }
  113. else {
  114. None
  115. }
  116. }
  117. }
  118. #[rustfmt::skip]
  119. #[derive(Clone, Debug, PartialEq, Routable)]
  120. enum Route {
  121. // Nests with parameters have types taken from child routes
  122. #[nest("/user/:user_id")]
  123. // Everything inside the nest has the added parameter `user_id: String`
  124. // UserFrame is a layout component that will receive the `user_id: String` parameter
  125. #[layout(UserFrame)]
  126. // Route1 is a non-layout component that will receive the `user_id: String` and `dynamic: String` parameters
  127. #[route("/:dynamic?:query")]
  128. Route1 {
  129. // The type is taken from the first instance of the dynamic parameter
  130. user_id: usize,
  131. dynamic: usize,
  132. query: String,
  133. extra: String,
  134. },
  135. // Route2 is a non-layout component that will receive the `user_id: String` parameter
  136. #[route("/hello_world")]
  137. // You can opt out of the layout by using the `!` prefix
  138. #[layout(!UserFrame)]
  139. Route2 { user_id: usize },
  140. #[end_layout]
  141. #[end_nest]
  142. #[redirect("/:id/user", |id: usize| Route::Route3 { dynamic: id.to_string()})]
  143. #[route("/:dynamic")]
  144. Route3 { dynamic: String },
  145. }