outlet.rs 2.9 KB

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