1
0

router.rs 2.3 KB

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