fix: class overwrites class when updating signal values (#46)

* fix: class overwrites class when updating signal values

* fix:  class rendering of ssr mode
This commit is contained in:
luoxiaozero 2023-12-12 20:44:37 +08:00 committed by GitHub
parent 69dd0c5086
commit 5fa0929cbf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 72 additions and 11 deletions

View file

@ -1,6 +1,12 @@
mod theme; mod theme;
use crate::{theme::use_theme, utils::mount_style, Icon, Theme}; #[cfg(not(feature = "ssr"))]
use crate::utils::dyn_classes;
use crate::{
theme::use_theme,
utils::{mount_style, ssr_class},
Icon, Theme,
};
use icondata::AiIcon; use icondata::AiIcon;
use leptos::*; use leptos::*;
pub use theme::AlertTheme; pub use theme::AlertTheme;
@ -79,9 +85,12 @@ pub fn Alert(
} }
.into() .into()
}); });
let ssr_class = ssr_class(&class);
view! { view! {
<div <div
class=move || class.get() class=ssr_class
use:dyn_classes=class
class:thaw-alert=true class:thaw-alert=true
style=move || css_vars.get()> style=move || css_vars.get()>
<Icon icon class="thaw-alert__icon"/> <Icon icon class="thaw-alert__icon"/>

View file

@ -1,5 +1,6 @@
mod theme; mod theme;
use crate::utils::{dyn_classes, ssr_class};
use crate::{ use crate::{
components::{Binder, Follower, FollowerPlacement, FollowerWidth}, components::{Binder, Follower, FollowerPlacement, FollowerWidth},
use_theme, use_theme,
@ -108,9 +109,10 @@ pub fn AutoComplete(
} }
}; };
let ssr_class = ssr_class(&class);
view! { view! {
<Binder target_ref=auto_complete_ref> <Binder target_ref=auto_complete_ref>
<div class=move || class.get() class:thaw-auto-complete=true ref=auto_complete_ref on:keydown=on_keydown> <div class=ssr_class use:dyn_classes=class class:thaw-auto-complete=true ref=auto_complete_ref on:keydown=on_keydown>
<Input <Input
value value
placeholder placeholder
@ -194,5 +196,3 @@ pub fn AutoComplete(
</Binder> </Binder>
} }
} }

View file

@ -1,6 +1,12 @@
mod theme; mod theme;
use crate::{use_theme, utils::mount_style, Theme}; #[cfg(not(feature = "ssr"))]
use crate::utils::dyn_classes;
use crate::{
use_theme,
utils::{mount_style, ssr_class},
Theme,
};
use leptos::*; use leptos::*;
pub use theme::AvatarTheme; pub use theme::AvatarTheme;
@ -28,8 +34,10 @@ pub fn Avatar(
css_vars css_vars
}); });
mount_style("avatar", include_str!("./avatar.css")); mount_style("avatar", include_str!("./avatar.css"));
let ssr_class = ssr_class(&class);
view! { view! {
<span class=move || class.get() class:thaw-avatar=true style=move || css_vars.get()> <span class=ssr_class use:dyn_classes=class class:thaw-avatar=true style=move || css_vars.get()>
{move || { {move || {
let src = src.get(); let src = src.get();
(!src.is_empty()).then(|| view! { <img src=src/> }) (!src.is_empty()).then(|| view! { <img src=src/> })

View file

@ -1,11 +1,13 @@
mod button_group; mod button_group;
mod theme; mod theme;
#[cfg(not(feature = "ssr"))]
use crate::utils::dyn_classes;
use crate::{ use crate::{
components::{OptionComp, Wave, WaveRef}, components::{OptionComp, Wave, WaveRef},
icon::*, icon::*,
theme::*, theme::*,
utils::{mount_style, ComponentRef}, utils::{mount_style, ssr_class, ComponentRef},
}; };
pub use button_group::ButtonGroup; pub use button_group::ButtonGroup;
use leptos::*; use leptos::*;
@ -220,9 +222,11 @@ pub fn Button(
callback.call(event); callback.call(event);
}; };
let ssr_class = ssr_class(&class);
view! { view! {
<button <button
class=move || class.get() class=ssr_class
use:dyn_classes=class
class:thaw-button=true class:thaw-button=true
class=("thaw-button--solid", move || variant.get() == ButtonVariant::Solid) class=("thaw-button--solid", move || variant.get() == ButtonVariant::Solid)
class=("thaw-button--text", move || variant.get() == ButtonVariant::Text) class=("thaw-button--text", move || variant.get() == ButtonVariant::Text)

View file

@ -158,6 +158,7 @@ fn Panel(
#[cfg(not(any(feature = "csr", feature = "hydrate")))] #[cfg(not(any(feature = "csr", feature = "hydrate")))]
{ {
_ = time_picker_ref; _ = time_picker_ref;
_ = panel_ref;
} }
let hour_ref = create_node_ref::<html::Div>(); let hour_ref = create_node_ref::<html::Div>();

37
src/utils/dyn_classes.rs Normal file
View file

@ -0,0 +1,37 @@
use cfg_if::cfg_if;
use leptos::{html::AnyElement, HtmlElement, MaybeSignal};
pub fn dyn_classes(el: HtmlElement<AnyElement>, classes_signal: MaybeSignal<String>) {
cfg_if! {
if #[cfg(feature = "ssr")] {
let _ = el;
let _ = classes_signal;
} else {
use leptos::SignalGet;
let _ = el.dyn_classes(move || {
let classes = classes_signal.get();
if classes.is_empty() {
return vec![];
}
classes
.split_ascii_whitespace()
.map(|class| class.to_string())
.collect::<Vec<String>>()
});
}
};
}
pub fn ssr_class(class: &MaybeSignal<String>) -> String {
let ssr_class;
cfg_if! {
if #[cfg(feature = "ssr")] {
use leptos::SignalGetUntracked;
ssr_class = class.get_untracked();
} else {
let _ = class;
ssr_class = String::new();
}
};
ssr_class
}

View file

@ -1,5 +1,6 @@
// mod callback; // mod callback;
mod component_ref; mod component_ref;
mod dyn_classes;
mod event_listener; mod event_listener;
mod mount_style; mod mount_style;
mod signal; mod signal;
@ -7,6 +8,7 @@ mod stored_maybe_signal;
// pub use callback::AsyncCallback; // pub use callback::AsyncCallback;
pub(crate) use component_ref::ComponentRef; pub(crate) use component_ref::ComponentRef;
pub(crate) use dyn_classes::*;
pub(crate) use event_listener::*; pub(crate) use event_listener::*;
pub(crate) use mount_style::mount_style; pub(crate) use mount_style::mount_style;
pub use signal::SignalWatch; pub use signal::SignalWatch;