outlet.rs 3.0 KB

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