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}