router.rs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #![allow(non_snake_case)]
  2. use dioxus::prelude::*;
  3. use dioxus_router::prelude::*;
  4. fn main() {
  5. dioxus_desktop::launch(app);
  6. }
  7. fn app(cx: Scope) -> Element {
  8. use_router(cx, &RouterConfiguration::default, &|| {
  9. Segment::content(comp(Home))
  10. .fixed(
  11. "users",
  12. Route::empty()
  13. .nested(Segment::content(comp(UserList)).catch_all((comp(User), UserId {}))),
  14. )
  15. .fixed(
  16. "blog",
  17. Route::empty().nested(
  18. Segment::content(comp(BlogList)).catch_all((comp(BlogPost), PostId {})),
  19. ),
  20. )
  21. .fallback(comp(E404))
  22. });
  23. cx.render(rsx! {
  24. ul {
  25. li { Link { target: "/", "Go home!" } }
  26. li { Link { target: "/users", "List all users" } }
  27. li { Link { target: "/blog", "Blog posts" }}
  28. }
  29. Outlet { }
  30. })
  31. }
  32. fn Home(cx: Scope) -> Element {
  33. render!(h1 { "Home" })
  34. }
  35. fn BlogList(cx: Scope) -> Element {
  36. render! {
  37. h1 { "Blog Posts" }
  38. ul {
  39. li { Link { target: "/blog/1", "First blog post" } }
  40. li { Link { target: "/blog/2", "Second blog post" } }
  41. li { Link { target: "/blog/3", "Third blog post" } }
  42. }
  43. }
  44. }
  45. struct PostId;
  46. fn BlogPost(cx: Scope) -> Element {
  47. let post = use_route(cx)?.parameter::<PostId>().unwrap();
  48. cx.render(rsx! {
  49. div {
  50. h1 { "Reading blog post: {post}" }
  51. p { "example blog post" }
  52. }
  53. })
  54. }
  55. fn UserList(cx: Scope) -> Element {
  56. render! {
  57. h1 { "Users" }
  58. ul {
  59. li { Link { target: "/users/bill", "Bill" } }
  60. li { Link { target: "/users/jeremy", "Jeremy" } }
  61. li { Link { target: "/users/adrian", "Adrian" } }
  62. }
  63. }
  64. }
  65. struct UserId;
  66. fn User(cx: Scope) -> Element {
  67. let state = use_route(cx)?;
  68. let user = state.parameter::<UserId>().unwrap();
  69. let query = state.query.as_ref().cloned().unwrap_or_default();
  70. let bold = query.contains("bold") && !query.contains("bold=false");
  71. cx.render(rsx! {
  72. div {
  73. h1 { "Showing user: {user}" }
  74. if bold {
  75. rsx!{ b { "bold" } }
  76. } else {
  77. rsx!{ i { "italic" } }
  78. }
  79. }
  80. })
  81. }
  82. fn E404(cx: Scope) -> Element {
  83. render!(h1 { "Error 404 - Page not Found" })
  84. }