yew_hooks/hooks/
use_window_scroll.rs

1use gloo::utils::window;
2use yew::prelude::*;
3
4use super::{use_event_with_window, use_mount, use_raf_state};
5
6/// A sensor hook that tracks Window scroll position.
7///
8/// # Example
9///
10/// ```rust
11/// # use yew::prelude::*;
12/// #
13/// use yew_hooks::prelude::*;
14///
15/// #[function_component(UseWindowScroll)]
16/// fn window_scroll() -> Html {
17///     let state = use_window_scroll();
18///     
19///     html! {
20///         <>
21///             <b>{ " X: " }</b>
22///             { state.0 }
23///             <b>{ " Y: " }</b>
24///             { state.1 }
25///         </>
26///     }
27/// }
28/// ```
29#[hook]
30pub fn use_window_scroll() -> (f64, f64) {
31    let state = use_raf_state(|| {
32        (
33            window().page_x_offset().unwrap(),
34            window().page_y_offset().unwrap(),
35        )
36    });
37
38    {
39        let state = state.clone();
40        use_event_with_window("scroll", move |_: Event| {
41            state.set((
42                window().page_x_offset().unwrap(),
43                window().page_y_offset().unwrap(),
44            ));
45        });
46    }
47
48    {
49        let state = state.clone();
50        use_mount(move || {
51            state.set((
52                window().page_x_offset().unwrap(),
53                window().page_y_offset().unwrap(),
54            ));
55        });
56    }
57
58    *state
59}