1
0

router.rs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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 {}
  39. }
  40. }
  41. #[inline_props]
  42. fn NavBar(cx: Scope) -> Element {
  43. render! {
  44. nav {
  45. ul {
  46. li { Link { target: Route::Home {}, "Home" } }
  47. li { Link { target: Route::BlogList {}, "Blog" } }
  48. }
  49. }
  50. Outlet {}
  51. }
  52. }
  53. #[inline_props]
  54. fn Home(cx: Scope) -> Element {
  55. render! {
  56. h1 { "Welcome to the Dioxus Blog!" }
  57. }
  58. }
  59. #[inline_props]
  60. fn Blog(cx: Scope) -> Element {
  61. render! {
  62. h1 { "Blog" }
  63. Outlet {}
  64. }
  65. }
  66. #[inline_props]
  67. fn BlogList(cx: Scope) -> Element {
  68. render! {
  69. h2 { "Choose a post" }
  70. ul {
  71. li {
  72. Link {
  73. target: Route::BlogPost { name: "Blog post 1".into() },
  74. "Read the first blog post"
  75. }
  76. }
  77. li {
  78. Link {
  79. target: Route::BlogPost { name: "Blog post 2".into() },
  80. "Read the second blog post"
  81. }
  82. }
  83. }
  84. }
  85. }
  86. #[inline_props]
  87. fn BlogPost(cx: Scope, name: String) -> Element {
  88. render! {
  89. h2 { "Blog Post: {name}"}
  90. }
  91. }
  92. #[inline_props]
  93. fn PageNotFound(cx: Scope, route: Vec<String>) -> Element {
  94. render! {
  95. h1 { "Page not found" }
  96. p { "We are terribly sorry, but the page you requested doesn't exist." }
  97. pre {
  98. color: "red",
  99. "log:\nattemped to navigate to: {route:?}"
  100. }
  101. }
  102. }