outlet.rs 3.1 KB

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