main.rs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #![allow(unused)]
  2. //! Example: Url query segments usage
  3. //! ------------------------------------
  4. //!
  5. //! This example shows how to access and use multiple query segments present in an url on the web.
  6. //!
  7. //! Run `dx serve` and navigate to `http://localhost:8080/blog?name=John&surname=Doe`
  8. use std::fmt::Display;
  9. use dioxus::prelude::*;
  10. use dioxus_router::prelude::*;
  11. #[derive(Routable, Clone)]
  12. #[rustfmt::skip]
  13. enum Route {
  14. // segments that start with ?:.. are query segments that capture the entire query
  15. #[route("/blog?:..query_params")]
  16. BlogPost {
  17. // You must include query segments in child variants
  18. query_params: ManualBlogQuerySegments,
  19. },
  20. // segments that follow the ?:field&:other_field syntax are query segments that follow the standard url query syntax
  21. #[route("/autoblog?:name&:surname")]
  22. AutomaticBlogPost {
  23. name: String,
  24. surname: String,
  25. },
  26. }
  27. #[derive(Debug, Clone, PartialEq)]
  28. struct ManualBlogQuerySegments {
  29. name: String,
  30. surname: String,
  31. }
  32. /// The display impl needs to display the query in a way that can be parsed:
  33. impl Display for ManualBlogQuerySegments {
  34. fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
  35. write!(f, "name={}&surname={}", self.name, self.surname)
  36. }
  37. }
  38. /// The query segment is anything that implements <https://docs.rs/dioxus-router/latest/dioxus_router/routable/trait.FromQuery.html>. You can implement that trait for a struct if you want to parse multiple query parameters.
  39. impl FromQuery for ManualBlogQuerySegments {
  40. fn from_query(query: &str) -> Self {
  41. let mut name = None;
  42. let mut surname = None;
  43. let pairs = form_urlencoded::parse(query.as_bytes());
  44. pairs.for_each(|(key, value)| {
  45. if key == "name" {
  46. name = Some(value.clone().into());
  47. }
  48. if key == "surname" {
  49. surname = Some(value.clone().into());
  50. }
  51. });
  52. Self {
  53. name: name.unwrap(),
  54. surname: surname.unwrap(),
  55. }
  56. }
  57. }
  58. #[component]
  59. fn BlogPost(query_params: ManualBlogQuerySegments) -> Element {
  60. rsx! {
  61. div { "This is your blogpost with a query segment:" }
  62. div { "{query_params:?}" }
  63. }
  64. }
  65. #[component]
  66. fn AutomaticBlogPost(name: String, surname: String) -> Element {
  67. rsx! {
  68. div { "This is your blogpost with a query segment:" }
  69. div { "name={name}&surname={surname}" }
  70. }
  71. }
  72. #[component]
  73. fn App() -> Element {
  74. rsx! { Router::<Route> {} }
  75. }
  76. fn main() {
  77. launch(App);
  78. }