outlet.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #![allow(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. #[component]
  33. fn App(cx: Scope<AppProps>) -> Element {
  34. render! {
  35. h1 { "App" }
  36. Router::<Route> {
  37. config: {
  38. let path = cx.props.path.parse().unwrap();
  39. move || RouterConfig::default().history(MemoryHistory::with_initial_path(path))
  40. }
  41. }
  42. }
  43. }
  44. #[component]
  45. fn RootIndex(cx: Scope) -> Element {
  46. render! {
  47. h2 { "Root Index" }
  48. }
  49. }
  50. #[component]
  51. fn Fixed(cx: Scope) -> Element {
  52. render! {
  53. h2 { "Fixed" }
  54. Outlet::<Route> { }
  55. }
  56. }
  57. #[component]
  58. fn FixedIndex(cx: Scope) -> Element {
  59. render! {
  60. h3 { "Fixed - Index" }
  61. }
  62. }
  63. #[component]
  64. fn FixedFixed(cx: Scope) -> Element {
  65. render! {
  66. h3 { "Fixed - Fixed"}
  67. }
  68. }
  69. #[component]
  70. fn Parameter(cx: Scope, id: u8) -> Element {
  71. render! {
  72. h2 { "Parameter {id}" }
  73. Outlet::<Route> { }
  74. }
  75. }
  76. #[component]
  77. fn ParameterIndex(cx: Scope, id: u8) -> Element {
  78. render! {
  79. h3 { "Parameter - Index" }
  80. }
  81. }
  82. #[component]
  83. fn ParameterFixed(cx: Scope, id: u8) -> Element {
  84. render! {
  85. h3 { "Parameter - Fixed" }
  86. }
  87. }
  88. }
  89. #[test]
  90. fn root_index() {
  91. let vdom = prepare("/");
  92. let html = dioxus_ssr::render(&vdom);
  93. assert_eq!(html, "<h1>App</h1><h2>Root Index</h2>");
  94. }
  95. #[test]
  96. fn fixed() {
  97. let vdom = prepare("/fixed");
  98. let html = dioxus_ssr::render(&vdom);
  99. assert_eq!(html, "<h1>App</h1><h2>Fixed</h2><h3>Fixed - Index</h3>");
  100. }
  101. #[test]
  102. fn fixed_fixed() {
  103. let vdom = prepare("/fixed/fixed");
  104. let html = dioxus_ssr::render(&vdom);
  105. assert_eq!(html, "<h1>App</h1><h2>Fixed</h2><h3>Fixed - Fixed</h3>");
  106. }
  107. #[test]
  108. fn parameter() {
  109. let vdom = prepare("/18");
  110. let html = dioxus_ssr::render(&vdom);
  111. assert_eq!(
  112. html,
  113. "<h1>App</h1><h2>Parameter 18</h2><h3>Parameter - Index</h3>"
  114. );
  115. }
  116. #[test]
  117. fn parameter_fixed() {
  118. let vdom = prepare("/18/fixed");
  119. let html = dioxus_ssr::render(&vdom);
  120. assert_eq!(
  121. html,
  122. "<h1>App</h1><h2>Parameter 18</h2><h3>Parameter - Fixed</h3>"
  123. );
  124. }