File tree 7 files changed +81
-0
lines changed
crates/yew-hooks/src/hooks
7 files changed +81
-0
lines changed Original file line number Diff line number Diff line change @@ -135,6 +135,7 @@ fn counter() -> Html {
135
135
- ` use_geolocation ` - tracks user's geographic location.
136
136
- ` use_swipe ` - detects swipe based on TouchEvent.
137
137
- ` use_visible ` - checks if an element is visible.
138
+ - ` use_hovered ` - checks if an element is hovered.
138
139
139
140
### UI
140
141
Original file line number Diff line number Diff line change @@ -15,6 +15,7 @@ mod use_event;
15
15
mod use_favicon;
16
16
mod use_geolocation;
17
17
mod use_hash;
18
+ mod use_hovered;
18
19
mod use_infinite_scroll;
19
20
mod use_interval;
20
21
mod use_is_first_mount;
@@ -71,6 +72,7 @@ pub use use_event::*;
71
72
pub use use_favicon:: * ;
72
73
pub use use_geolocation:: * ;
73
74
pub use use_hash:: * ;
75
+ pub use use_hovered:: * ;
74
76
pub use use_infinite_scroll:: * ;
75
77
pub use use_interval:: * ;
76
78
pub use use_is_first_mount:: * ;
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change @@ -90,6 +90,7 @@ pub fn home() -> Html {
90
90
<li><Link <AppRoute > to={ AppRoute :: UseGeolocation } classes="text-emerald-800 underline" >{ "use_geolocation" } </Link <AppRoute >> { " - tracks user's geographic location." } </li>
91
91
<li><Link <AppRoute > to={ AppRoute :: UseSwipe } classes="text-emerald-800 underline" >{ "use_swipe" } </Link <AppRoute >> { " - detects swipe based on TouchEvent." } </li>
92
92
<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>
93
94
</ul>
94
95
95
96
<h2 class="text-2xl font-bold" >{ "UI" } </h2>
Original file line number Diff line number Diff line change @@ -16,6 +16,7 @@ mod use_event;
16
16
mod use_favicon;
17
17
mod use_geolocation;
18
18
mod use_hash;
19
+ mod use_hovered;
19
20
mod use_infinite_scroll;
20
21
mod use_interval;
21
22
mod use_is_first_mount;
@@ -74,6 +75,7 @@ pub use use_event::*;
74
75
pub use use_favicon:: * ;
75
76
pub use use_geolocation:: * ;
76
77
pub use use_hash:: * ;
78
+ pub use use_hovered:: * ;
77
79
pub use use_infinite_scroll:: * ;
78
80
pub use use_interval:: * ;
79
81
pub use use_is_first_mount:: * ;
Original file line number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change @@ -129,6 +129,8 @@ pub enum AppRoute {
129
129
UseInfiniteScroll ,
130
130
#[ at( "/use_visible" ) ]
131
131
UseVisible ,
132
+ #[ at( "/use_hovered" ) ]
133
+ UseHovered ,
132
134
#[ not_found]
133
135
#[ at( "/page-not-found" ) ]
134
136
PageNotFound ,
@@ -198,6 +200,7 @@ pub fn switch(routes: AppRoute) -> Html {
198
200
AppRoute :: UseClipboard => html ! { <UseClipboard /> } ,
199
201
AppRoute :: UseInfiniteScroll => html ! { <UseInfiniteScroll /> } ,
200
202
AppRoute :: UseVisible => html ! { <UseVisible /> } ,
203
+ AppRoute :: UseHovered => html ! { <UseHovered /> } ,
201
204
AppRoute :: PageNotFound => html ! { <Home /> } ,
202
205
}
203
206
}
You can’t perform that action at this time.
0 commit comments