outlet.rs 2.8 KB

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