simple_routes.rs 4.2 KB

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