forked from yewstack/yew
-
Notifications
You must be signed in to change notification settings - Fork 0
/
use_bool_toggle.rs
62 lines (55 loc) · 1.33 KB
/
use_bool_toggle.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use std::ops::Deref;
use std::rc::Rc;
use yew::{use_state_eq, UseStateHandle};
#[derive(Clone)]
pub struct UseBoolToggleHandle {
value: UseStateHandle<bool>,
toggle: Rc<dyn Fn()>,
}
impl UseBoolToggleHandle {
pub fn toggle(self) {
(self.toggle)()
}
}
impl Deref for UseBoolToggleHandle {
type Target = bool;
fn deref(&self) -> &Self::Target {
&self.value
}
}
/// This hook can be used to cause a re-render with the non-default value, which is
/// then reset to the default value after that render.
///
/// # Arguments
///
/// * `default` - The default value.
///
/// # Example
/// ```
/// use crate::hooks::use_bool_toggle::use_bool_toggle;
/// ...
/// let value = use_bool_toggle(false);
/// ...
/// let onclick = {
/// let value = value.clone();
/// move |_| {
/// value.toggle();
/// // This will toggle the value to true.
/// // Then render.
/// // Post render it will toggle back to false skipping the render.
/// }
/// }
/// <button {onclick}>{ "Click me" }</button>
/// ...
/// ```
pub fn use_bool_toggle(default: bool) -> UseBoolToggleHandle {
let state = use_state_eq(|| default);
let toggle = {
let state = state.clone();
Rc::new(move || state.set(!*state))
};
UseBoolToggleHandle {
value: state,
toggle,
}
}