Skip to content

Commit d4c0062

Browse files
authored
Added use_hovered hook (#47)
1 parent 6554ce0 commit d4c0062

File tree

7 files changed

+81
-0
lines changed

7 files changed

+81
-0
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ fn counter() -> Html {
135135
- `use_geolocation` - tracks user's geographic location.
136136
- `use_swipe` - detects swipe based on TouchEvent.
137137
- `use_visible` - checks if an element is visible.
138+
- `use_hovered` - checks if an element is hovered.
138139

139140
### UI
140141

crates/yew-hooks/src/hooks/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ mod use_event;
1515
mod use_favicon;
1616
mod use_geolocation;
1717
mod use_hash;
18+
mod use_hovered;
1819
mod use_infinite_scroll;
1920
mod use_interval;
2021
mod use_is_first_mount;
@@ -71,6 +72,7 @@ pub use use_event::*;
7172
pub use use_favicon::*;
7273
pub use use_geolocation::*;
7374
pub use use_hash::*;
75+
pub use use_hovered::*;
7476
pub use use_infinite_scroll::*;
7577
pub use use_interval::*;
7678
pub use use_is_first_mount::*;
+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use yew::prelude::*;
2+
3+
use super::use_event;
4+
5+
/// A sensor hook that tracks whether HTML element is being hovered.
6+
///
7+
/// # Example
8+
///
9+
/// ```rust
10+
/// # use yew::prelude::*;
11+
/// #
12+
/// use yew_hooks::prelude::*;
13+
///
14+
/// #[function_component(UseHovered)]
15+
/// fn hovered() -> Html {
16+
/// let node = use_node_ref();
17+
/// let state = use_hovered(node.clone());
18+
///
19+
/// html! {
20+
/// <div ref={node}>
21+
/// <b>{ " Hovered: " }</b>
22+
/// { state }
23+
/// </div>
24+
/// }
25+
/// }
26+
/// ```
27+
#[hook]
28+
pub fn use_hovered(node: NodeRef) -> bool {
29+
let state = use_state_eq(|| false);
30+
31+
{
32+
let state = state.clone();
33+
let node = node.clone();
34+
use_event(node, "mouseover", move |_: Event| {
35+
state.set(true);
36+
});
37+
}
38+
39+
{
40+
let state = state.clone();
41+
use_event(node, "mouseout", move |_: Event| {
42+
state.set(false);
43+
});
44+
}
45+
46+
*state
47+
}

examples/yew-app/src/app/home.rs

+1
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ pub fn home() -> Html {
9090
<li><Link<AppRoute> to={AppRoute::UseGeolocation} classes="text-emerald-800 underline" >{ "use_geolocation" }</Link<AppRoute>> { " - tracks user's geographic location." }</li>
9191
<li><Link<AppRoute> to={AppRoute::UseSwipe} classes="text-emerald-800 underline" >{ "use_swipe" }</Link<AppRoute>> { " - detects swipe based on TouchEvent." }</li>
9292
<li><Link<AppRoute> to={AppRoute::UseVisible} classes="text-emerald-800 underline" >{ "use_visible" }</Link<AppRoute>> { " - checks if an element is visible." }</li>
93+
<li><Link<AppRoute> to={AppRoute::UseHovered} classes="text-emerald-800 underline" >{ "use_hovered" }</Link<AppRoute>> { " - checks if an element is being hovered." }</li>
9394
</ul>
9495

9596
<h2 class="text-2xl font-bold">{ "UI" }</h2>

examples/yew-app/src/app/hooks/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ mod use_event;
1616
mod use_favicon;
1717
mod use_geolocation;
1818
mod use_hash;
19+
mod use_hovered;
1920
mod use_infinite_scroll;
2021
mod use_interval;
2122
mod use_is_first_mount;
@@ -74,6 +75,7 @@ pub use use_event::*;
7475
pub use use_favicon::*;
7576
pub use use_geolocation::*;
7677
pub use use_hash::*;
78+
pub use use_hovered::*;
7779
pub use use_infinite_scroll::*;
7880
pub use use_interval::*;
7981
pub use use_is_first_mount::*;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use yew::prelude::*;
2+
use yew_hooks::prelude::*;
3+
4+
/// `use_hovered` demo
5+
#[function_component]
6+
pub fn UseHovered() -> Html {
7+
let node = use_node_ref();
8+
let hovered = use_hovered(node.clone());
9+
10+
html! {
11+
<div class="container">
12+
<header class="mt-24 text-xl text-center">
13+
<div ref={node} class="bg-emerald-800 w-[400px] h-[200px] mx-auto text-slate-100 p-4">
14+
<p>
15+
<b>{ " Hovered: " }</b>
16+
{ hovered }
17+
</p>
18+
<p>
19+
{ "Try to hover your cursor over this element." }
20+
</p>
21+
</div>
22+
</header>
23+
</div>
24+
}
25+
}

examples/yew-app/src/app/mod.rs

+3
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ pub enum AppRoute {
129129
UseInfiniteScroll,
130130
#[at("/use_visible")]
131131
UseVisible,
132+
#[at("/use_hovered")]
133+
UseHovered,
132134
#[not_found]
133135
#[at("/page-not-found")]
134136
PageNotFound,
@@ -198,6 +200,7 @@ pub fn switch(routes: AppRoute) -> Html {
198200
AppRoute::UseClipboard => html! { <UseClipboard /> },
199201
AppRoute::UseInfiniteScroll => html! { <UseInfiniteScroll /> },
200202
AppRoute::UseVisible => html! { <UseVisible /> },
203+
AppRoute::UseHovered => html! { <UseHovered /> },
201204
AppRoute::PageNotFound => html! { <Home /> },
202205
}
203206
}

0 commit comments

Comments
 (0)