dioxus/packages/router
Jonathan Kelley 508c560320 Feat: massive changes to definition of components
This change switches back to the original `ctx<props>` syntax for
commponents. This lets lifetime elision to remove the need to match
exactly which lifetime (props or ctx) gets  carried to the output. As
such, `Props` is currently required to be static. It *is* possible to
loosen this restriction, and will be done in the future, though only
through adding metadata about the props through the Props derive
macro. Implementing the IS_STATIC trait is unsafe, so the derive macro
will do it through some heuristics.

For now, this unlocks sharing vnodes from parents to children, enabling
pass-thru components, fragments, portals, etc.
2021-06-01 18:33:15 -04:00
..
src Feat: add router 2021-01-20 17:48:58 -05:00
Cargo.toml Feat: add router 2021-01-20 17:48:58 -05:00
README.md Feat: massive changes to definition of components 2021-06-01 18:33:15 -04:00

Router hook for Dioxus apps

Dioxus-router provides a use_router hook that returns a different value depending on the route. The router is generic over any value, however it makes sense to return a different set of VNodes and feed them into the App's return VNodes.

Using the router should feel similar to tide's routing framework where an "address" book is assembled at the head.

Here's an example of how to use the router hook:

static App: FC<()> = |ctx| {

    // Route returns the associated VNodes
    // This hook re-fires when the route changes
    let route = use_router(ctx, |cfg| {
        cfg.at("/").serve(|ctx| {
            html!{ <LandingPage /> }
        });

        cfg.at("/shoes/:id").serve(|ctx| {
            let id: Uuid = ctx.ctx.parse().unwrap();
            html!{ <ShoesPage id=id /> }
        });

        cfg.at("/pants/:id").serve(|ctx| {
            let id: Uuid = ctx.ctx.parse().unwrap();
            html!{ <PantsPage id=id /> }
        });
    });

    html! {
        <PanicBoundary model={|_| html!{<div>"Uh oh!"</div>}}>
            <StateManager>
                <ThemeSystem>
                    <Header />
                    {route}
                </ThemeSystem>
            </StateManager>
        </PanicBoundary >
    }
};

Currently, the router is only supported in a web environment, but we plan to add 1st-party support via the context API when new renderers are available.