Skip to main content

dioxus_router/hooks/
use_navigator.rs

1use dioxus_core::{try_consume_context, use_hook};
2
3use crate::{Navigator, RouterContext};
4
5/// A hook that provides access to the navigator to change the router history.
6///
7/// > The Routable macro will define a version of this hook with an explicit type.
8///
9/// ```rust
10/// # use dioxus::prelude::*;
11/// #[derive(Clone, Routable)]
12/// enum Route {
13///     #[route("/")]
14///     Index {},
15///     #[route("/:id")]
16///     Dynamic { id: usize },
17/// }
18///
19/// #[component]
20/// fn App() -> Element {
21///     rsx! {
22///         Router::<Route> {}
23///     }
24/// }
25///
26/// #[component]
27/// fn Index() -> Element {
28///     let navigator = use_navigator();
29///
30///     rsx! {
31///         button {
32///             onclick: move |_| { navigator.push(Route::Dynamic { id: 1234 }); },
33///             "Go to /1234"
34///         }
35///     }
36/// }
37///
38/// #[component]
39/// fn Dynamic(id: usize) -> Element {
40///     rsx! {
41///         p {
42///             "Current ID: {id}"
43///         }
44///     }
45/// }
46///
47/// # let mut vdom = VirtualDom::new(App);
48/// # vdom.rebuild_in_place();
49/// ```
50#[must_use]
51pub fn use_navigator() -> Navigator {
52    use_hook(|| {
53        let router = try_consume_context::<RouterContext>()
54            .expect("Must be called in a descendant of a Router component");
55
56        Navigator(router)
57    })
58}