diff --git a/packages/router/src/components/child_router.rs b/packages/router/src/components/child_router.rs index edead0735d..0480196330 100644 --- a/packages/router/src/components/child_router.rs +++ b/packages/router/src/components/child_router.rs @@ -1,8 +1,8 @@ /// Components that allow the macro to add child routers. This component provides a context /// to the child router that maps child routes to root routes and vice versa. -use crate::Routable; +use crate::{Outlet, OutletContext, Routable}; use dioxus_core::{provide_context, try_consume_context, use_hook, Element}; -use dioxus_core_macro::{component, Props}; +use dioxus_core_macro::{component, rsx, Props}; /// Maps a child route into the root router and vice versa // NOTE: Currently child routers only support simple static prefixes, but this @@ -61,8 +61,9 @@ pub fn ChildRouter(props: ChildRouterProps) -> Element { provide_context(ChildRouteMapping { format_route_as_root_route: props.format_route_as_root_route, parse_route_from_root_route: props.parse_route_from_root_route, - }) + }); + provide_context(OutletContext::::new()); }); - props.route.render(0) + rsx! { Outlet:: {} } } diff --git a/packages/router/tests/via_ssr/child_outlet.rs b/packages/router/tests/via_ssr/child_outlet.rs new file mode 100644 index 0000000000..ed8b71f3ef --- /dev/null +++ b/packages/router/tests/via_ssr/child_outlet.rs @@ -0,0 +1,77 @@ +#![allow(unused)] + +use std::rc::Rc; + +use dioxus::prelude::*; +use dioxus_history::{History, MemoryHistory}; +use dioxus_router::components::HistoryProvider; + +fn prepare(path: impl Into) -> VirtualDom { + let mut vdom = VirtualDom::new_with_props( + App, + AppProps { + path: path.into().parse().unwrap(), + }, + ); + vdom.rebuild_in_place(); + return vdom; + + #[derive(Routable, Clone, PartialEq)] + #[rustfmt::skip] + enum Route { + #[layout(Layout)] + #[child("/")] + Child { child: ChildRoute }, + } + + #[derive(Routable, Clone, PartialEq)] + #[rustfmt::skip] + enum ChildRoute{ + #[layout(ChildLayout)] + #[route("/")] + RootIndex {} + } + + #[component] + fn App(path: Route) -> Element { + rsx! { + h1 { "App" } + HistoryProvider { + history: move |_| Rc::new(MemoryHistory::with_initial_path(path.clone())) as Rc, + Router:: {} + } + } + } + + #[component] + fn RootIndex() -> Element { + rsx! { h2 { "Root Index" } } + } + + #[component] + fn Layout() -> Element { + rsx! { + h2 { "parent layout" } + Outlet:: { } + } + } + + #[component] + fn ChildLayout() -> Element { + rsx! { + h2 { "child layout" } + Outlet:: { } + } + } +} + +#[test] +fn root_index() { + let vdom = prepare("/"); + let html = dioxus_ssr::render(&vdom); + + assert_eq!( + html, + "

App

parent layout

child layout

Root Index

" + ); +} diff --git a/packages/router/tests/via_ssr/main.rs b/packages/router/tests/via_ssr/main.rs index cd03f46220..5682601348 100644 --- a/packages/router/tests/via_ssr/main.rs +++ b/packages/router/tests/via_ssr/main.rs @@ -1,3 +1,4 @@ +mod child_outlet; mod link; mod navigation; mod outlet;