Skip to content

Commit 1af5b25

Browse files
authored
feat: Lazy mount (#161)
* feat: Drawer lazy mount * feat: Binder lazy mount
1 parent f1c3882 commit 1af5b25

File tree

11 files changed

+63
-40
lines changed

11 files changed

+63
-40
lines changed

thaw/src/auto_complete/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ pub fn AutoComplete(
204204
<CSSTransition
205205
node_ref=menu_ref
206206
name="fade-in-scale-up-transition"
207+
appear=is_show_menu.get_untracked()
207208
show=is_show_menu
208209
let:display
209210
>

thaw/src/color_picker/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ pub fn ColorPicker(
152152
<CSSTransition
153153
node_ref=popover_ref
154154
name="fade-in-scale-up-transition"
155+
appear=is_show_popover.get_untracked()
155156
show=is_show_popover
156157
let:display
157158
>

thaw/src/date_picker/panel/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ pub fn Panel(
9393
<CSSTransition
9494
node_ref=panel_ref
9595
name="fade-in-scale-up-transition"
96+
appear=is_show_panel.get_untracked()
9697
show=is_show_panel
9798
let:display
9899
>

thaw/src/drawer/mod.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ pub fn Drawer(
8787
<div class="thaw-drawer-container" style=move || style.get()>
8888
<CSSTransition
8989
node_ref=mask_ref
90+
appear=show.get_untracked()
9091
show=show.signal()
9192
name="fade-in-transition"
9293
let:display
@@ -100,6 +101,7 @@ pub fn Drawer(
100101
</CSSTransition>
101102
<CSSTransition
102103
node_ref=drawer_ref
104+
appear=show.get_untracked()
103105
show=show.signal()
104106
name=Memo::new(move |_| {
105107
format!("slide-in-from-{}-transition", placement.get())
@@ -137,7 +139,7 @@ pub fn Drawer(
137139
view! { <DrawerInnr show mask_closeable close_on_esc title placement class style children/> }
138140
}
139141
DrawerMount::Body => view! {
140-
<Teleport>
142+
<Teleport immediate=show.signal()>
141143
<DrawerInnr show mask_closeable close_on_esc title placement class style children/>
142144
</Teleport>
143145
},

thaw/src/modal/mod.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ pub fn Modal(
6464
});
6565

6666
view! {
67-
<Teleport>
67+
<Teleport immediate=show.signal()>
6868
<FocusTrap disabled=!close_on_esc active=show.signal() on_esc>
6969
<div
7070
class="thaw-modal-container"
@@ -78,6 +78,7 @@ pub fn Modal(
7878
>
7979
<CSSTransition
8080
node_ref=mask_ref
81+
appear=show.get_untracked()
8182
show=show.signal()
8283
name="fade-in-transition"
8384
let:display
@@ -91,6 +92,7 @@ pub fn Modal(
9192
</CSSTransition>
9293
<CSSTransition
9394
node_ref=modal_ref
95+
appear=show.get_untracked()
9496
show=show.signal()
9597
name="fade-in-scale-up-transition"
9698
on_enter

thaw/src/popover/mod.rs

+2-4
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,6 @@ pub fn Popover(
110110
children: trigger_children,
111111
} = popover_trigger;
112112

113-
let follower_enabled = RwSignal::new(false);
114113
view! {
115114
<Binder target_ref>
116115
<div
@@ -121,13 +120,12 @@ pub fn Popover(
121120
>
122121
{trigger_children()}
123122
</div>
124-
<Follower slot show=follower_enabled placement>
123+
<Follower slot show=is_show_popover placement>
125124
<CSSTransition
126125
node_ref=popover_ref
127126
name="popover-transition"
127+
appear=is_show_popover.get_untracked()
128128
show=is_show_popover
129-
on_enter=move |_| follower_enabled.set(true)
130-
on_after_leave=move |_| follower_enabled.set(false)
131129
let:display
132130
>
133131
<div

thaw/src/scrollbar/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,6 @@ pub struct ScrollbarRef {
337337

338338
impl ScrollbarRef {
339339
pub fn container_scroll_top(&self) -> i32 {
340-
self.container_scroll_top.get()
340+
self.container_scroll_top.get_untracked()
341341
}
342342
}

thaw/src/select/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ where
127127
<CSSTransition
128128
node_ref=menu_ref
129129
name="fade-in-scale-up-transition"
130+
appear=is_show_menu.get_untracked()
130131
show=is_show_menu
131132
let:display
132133
>

thaw/src/time_picker/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ fn Panel(
178178
<CSSTransition
179179
node_ref=panel_ref
180180
name="fade-in-scale-up-transition"
181+
appear=is_show_panel.get_untracked()
181182
show=is_show_panel
182183
let:display
183184
>

thaw_components/src/binder/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ fn FollowerContainer<El: ElementDescriptor + Clone + 'static>(
239239
)
240240
});
241241

242-
view! { <Teleport element=children/> }
242+
view! { <Teleport element=children immediate=show/> }
243243
}
244244

245245
fn get_scroll_parent(element: Option<HtmlElement<AnyElement>>) -> Option<HtmlElement<AnyElement>> {

thaw_components/src/teleport/mod.rs

+48-32
Original file line numberDiff line numberDiff line change
@@ -4,56 +4,72 @@ use leptos::{html::AnyElement, *};
44
/// https://github.com/solidjs/solid/blob/main/packages/solid/web/src/index.ts#L56
55
#[component]
66
pub fn Teleport(
7+
#[prop(default = true.into(), into)] immediate: MaybeSignal<bool>,
78
#[prop(into, optional)] mount: Option<web_sys::Element>,
89
#[prop(optional, into)] element: Option<HtmlElement<AnyElement>>,
910
#[prop(optional)] children: Option<Children>,
1011
) -> impl IntoView {
1112
cfg_if! { if #[cfg(all(target_arch = "wasm32", any(feature = "csr", feature = "hydrate")))] {
12-
use leptos::wasm_bindgen::JsCast;
13-
use leptos::leptos_dom::Mountable;
14-
use thaw_utils::with_hydration_off;
13+
let mount_fn = StoredValue::new(None::<Box<dyn FnOnce() -> ()>>);
1514

16-
let mount = mount.unwrap_or_else(|| {
17-
document()
18-
.body()
19-
.expect("body element to exist")
20-
.unchecked_into()
21-
});
22-
23-
if let Some(element) = element {
24-
let render_root = element;
25-
let _ = mount.append_child(&render_root);
26-
on_cleanup(move || {
27-
let _ = mount.remove_child(&render_root);
28-
});
29-
} else if let Some(children) = children {
30-
let container = document()
31-
.create_element("div")
32-
.expect("element creation to work");
33-
with_hydration_off(|| {
34-
let _ = container.append_child(&children().into_view().get_mountable_node());
15+
mount_fn.set_value(Some(Box::new(move || {
16+
let mount = mount.unwrap_or_else(|| {
17+
use leptos::wasm_bindgen::JsCast;
18+
document()
19+
.body()
20+
.expect("body element to exist")
21+
.unchecked_into()
3522
});
3623

37-
let render_root = container;
38-
let _ = mount.append_child(&render_root);
39-
on_cleanup(move || {
40-
let _ = mount.remove_child(&render_root);
41-
});
42-
} else {
43-
return;
44-
};
24+
if let Some(element) = element {
25+
let render_root = element;
26+
let _ = mount.append_child(&render_root);
27+
on_cleanup(move || {
28+
let _ = mount.remove_child(&render_root);
29+
});
30+
} else if let Some(children) = children {
31+
let container = document()
32+
.create_element("div")
33+
.expect("element creation to work");
34+
35+
thaw_utils::with_hydration_off(|| {
36+
use leptos::leptos_dom::Mountable;
37+
let _ = container.append_child(&children().into_view().get_mountable_node());
38+
});
39+
40+
let render_root = container;
41+
let _ = mount.append_child(&render_root);
42+
on_cleanup(move || {
43+
let _ = mount.remove_child(&render_root);
44+
});
45+
}
46+
})));
47+
48+
let owner = Owner::current();
49+
Effect::new(move |_| {
50+
if immediate.get() {
51+
mount_fn.update_value(|mount_fn| {
52+
if let Some(f) = mount_fn.take() {
53+
with_owner(owner.unwrap(), move || {
54+
f();
55+
});
56+
}
57+
});
58+
}
59+
});
4560
} else {
4661
let _ = mount;
62+
let _ = immediate;
4763
#[cfg(not(feature = "ssr"))]
4864
{
4965
let _ = element;
5066
let _ = children;
5167
}
5268
#[cfg(feature = "ssr")]
5369
if element.is_none() {
54-
if let Some(children) = children {
70+
if let Some(children) = children {
5571
// Consumed hydration `id`
56-
let _ = children();
72+
let _ = children();
5773
}
5874
}
5975
}}

0 commit comments

Comments
 (0)