Skip to content

Commit 562fa22

Browse files
committed
feat: React.useRef
1 parent 50f4693 commit 562fa22

File tree

4 files changed

+93
-0
lines changed

4 files changed

+93
-0
lines changed

src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
mod element;
22
mod macro_import;
3+
mod use_ref;
34
mod use_state;
45

56
pub use element::*;
7+
pub use use_ref::*;
68
pub use use_state::*;
79

810
pub mod react_dom;

src/use_ref/helpers.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use wasm_bindgen::prelude::*;
2+
3+
use super::macro_helpers::define_react_use_ref_helpers;
4+
5+
define_react_use_ref_helpers! {
6+
{
7+
value: usize,
8+
object: MutableRefObjectUsize,
9+
use_ref_usize,
10+
use_ref_usize_with,
11+
},
12+
}

src/use_ref/macro_helpers.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
macro_rules! define_react_use_ref_for_type {
2+
( { value: $type_value:ty, $($t:tt)+ } ) => {
3+
define_react_use_ref_for_type! {{
4+
input: $type_value,
5+
output: $type_value,
6+
$($t)+
7+
}}
8+
};
9+
({
10+
input: $input_type:ty,
11+
output: $output_type:ty,
12+
object: $name_object:ident,
13+
$name_use:ident,
14+
$name_use_with:ident
15+
$(,)?
16+
}) => {
17+
use $crate::macro_import::wasm_bindgen_react;
18+
use std::stringify;
19+
20+
wasm_bindgen_react! {
21+
/// MutableRefObject<
22+
#[doc = stringify!($output_type)]
23+
/// >
24+
#[derive(Debug, Clone)]
25+
pub type $name_object;
26+
#[wasm_bindgen(structural, method, getter)]
27+
pub fn current(this: &$name_object) -> $output_type;
28+
#[wasm_bindgen(structural, method, setter)]
29+
pub fn set_current(this: &$name_object, val: $input_type);
30+
31+
#[wasm_bindgen(js_namespace = React, js_name = useRef)]
32+
pub fn $name_use(initial_value: $input_type) -> $name_object;
33+
34+
/// Closure `get_initial_value` will be called immediately,
35+
/// thus it is safe to use reference here.
36+
///
37+
/// Closure `get_initial_value` will be called only once or never called
38+
#[wasm_bindgen(js_namespace = React, js_name = useRef)]
39+
pub fn $name_use_with(get_initial_value: &mut dyn FnMut() -> $input_type) -> $name_object;
40+
}
41+
};
42+
}
43+
44+
macro_rules! define_react_use_ref_helpers {
45+
($($t:tt),+ $(,)?) => {
46+
use $crate::use_ref::macro_helpers::define_react_use_ref_for_type;
47+
$( define_react_use_ref_for_type!{ $t } )+
48+
};
49+
}
50+
51+
pub(super) use define_react_use_ref_for_type;
52+
pub(super) use define_react_use_ref_helpers;

src/use_ref/mod.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
use crate::macro_import::wasm_bindgen_react;
2+
use wasm_bindgen::prelude::*;
3+
4+
mod macro_helpers;
5+
6+
mod helpers;
7+
pub use helpers::*;
8+
9+
wasm_bindgen_react! {
10+
pub type MutableRefObject;
11+
#[wasm_bindgen(structural, method, getter)]
12+
pub fn current(this: &MutableRefObject) -> JsValue;
13+
#[wasm_bindgen(structural, method, setter)]
14+
pub fn set_current(this: &MutableRefObject, val: JsValue);
15+
16+
#[wasm_bindgen(js_namespace = React, js_name = useRef)]
17+
pub fn use_ref(initial_value: &JsValue) -> MutableRefObject;
18+
19+
/// Closure `get_initial_value` will be called immediately,
20+
/// thus it is safe to use reference here.
21+
///
22+
/// Closure `get_initial_value` will be called only once or never called
23+
#[wasm_bindgen(js_namespace = React, js_name = useRef)]
24+
pub fn use_ref_with(
25+
get_initial_value: &mut dyn FnMut() -> JsValue,
26+
) -> MutableRefObject;
27+
}

0 commit comments

Comments
 (0)