1
0

outlet.rs 3.2 KB

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