outlet.rs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #![allow(non_snake_case, unused)]
  2. use dioxus::prelude::*;
  3. use dioxus_router::prelude::*;
  4. use serde::{Deserialize, Serialize};
  5. fn prepare(path: impl Into<String>) -> VirtualDom {
  6. let mut vdom = VirtualDom::new_with_props(App, AppProps { path: path.into() });
  7. let _ = vdom.rebuild();
  8. return vdom;
  9. #[derive(Routable, Clone, Serialize, Deserialize)]
  10. #[rustfmt::skip]
  11. enum Route {
  12. #[route("/")]
  13. RootIndex {},
  14. #[nest("/fixed")]
  15. #[layout(Fixed)]
  16. #[route("/")]
  17. FixedIndex {},
  18. #[route("/fixed")]
  19. FixedFixed {},
  20. #[end_layout]
  21. #[end_nest]
  22. #[nest("/:id")]
  23. #[layout(Parameter)]
  24. #[route("/")]
  25. ParameterIndex { id: u8 },
  26. #[route("/fixed")]
  27. ParameterFixed { id: u8 },
  28. }
  29. #[derive(Debug, Props, PartialEq)]
  30. struct AppProps {
  31. path: String,
  32. }
  33. fn App(cx: Scope<AppProps>) -> Element {
  34. let cfg = RouterConfiguration {
  35. history: Box::new(MemoryHistory::with_initial_path(cx.props.path.clone()).unwrap()),
  36. ..Default::default()
  37. };
  38. render! {
  39. h1 { "App" }
  40. Router {
  41. config: cfg
  42. }
  43. }
  44. }
  45. #[inline_props]
  46. fn RootIndex(cx: Scope) -> Element {
  47. render! {
  48. h2 { "Root Index" }
  49. }
  50. }
  51. #[inline_props]
  52. fn Fixed(cx: Scope) -> Element {
  53. render! {
  54. h2 { "Fixed" }
  55. Outlet { }
  56. }
  57. }
  58. #[inline_props]
  59. fn FixedIndex(cx: Scope) -> Element {
  60. render! {
  61. h3 { "Fixed - Index" }
  62. }
  63. }
  64. #[inline_props]
  65. fn FixedFixed(cx: Scope) -> Element {
  66. render! {
  67. h3 { "Fixed - Fixed"}
  68. }
  69. }
  70. #[inline_props]
  71. fn Parameter(cx: Scope, id: u8) -> Element {
  72. render! {
  73. h2 { "Parameter {id}" }
  74. Outlet { }
  75. }
  76. }
  77. #[inline_props]
  78. fn ParameterIndex(cx: Scope, id: u8) -> Element {
  79. render! {
  80. h3 { "Parameter - Index" }
  81. }
  82. }
  83. #[inline_props]
  84. fn ParameterFixed(cx: Scope, id: u8) -> Element {
  85. render! {
  86. h3 { "Parameter - Fixed" }
  87. }
  88. }
  89. }
  90. #[test]
  91. fn root_index() {
  92. let vdom = prepare("/");
  93. let html = dioxus_ssr::render(&vdom);
  94. assert_eq!(html, "<h1>App</h1><h2>Root Index</h2>");
  95. }
  96. #[test]
  97. fn fixed() {
  98. let vdom = prepare("/fixed");
  99. let html = dioxus_ssr::render(&vdom);
  100. assert_eq!(html, "<h1>App</h1><h2>Fixed</h2><h3>Fixed - Index</h3>");
  101. }
  102. #[test]
  103. fn fixed_fixed() {
  104. let vdom = prepare("/fixed/fixed");
  105. let html = dioxus_ssr::render(&vdom);
  106. assert_eq!(html, "<h1>App</h1><h2>Fixed</h2><h3>Fixed - Fixed</h3>");
  107. }
  108. #[test]
  109. fn parameter() {
  110. let vdom = prepare("/18");
  111. let html = dioxus_ssr::render(&vdom);
  112. assert_eq!(
  113. html,
  114. "<h1>App</h1><h2>Parameter 18</h2><h3>Parameter - Index</h3>"
  115. );
  116. }
  117. #[test]
  118. fn parameter_fixed() {
  119. let vdom = prepare("/18/fixed");
  120. let html = dioxus_ssr::render(&vdom);
  121. assert_eq!(
  122. html,
  123. "<h1>App</h1><h2>Parameter 18</h2><h3>Parameter - Fixed</h3>"
  124. );
  125. }