feat: add if component

This commit is contained in:
luoxiao 2023-05-16 00:01:58 +08:00
parent 10f5403826
commit a6e30e38a0
3 changed files with 52 additions and 2 deletions

34
src/components/if_comp.rs Normal file
View file

@ -0,0 +1,34 @@
use leptos::*;
use super::Fallback;
#[slot]
pub struct Then {
children: ChildrenFn,
}
#[slot]
pub struct ElseIf {
cond: MaybeSignal<bool>,
children: ChildrenFn,
}
#[component]
pub fn If(
cx: Scope,
cond: MaybeSignal<bool>,
then: Then,
#[prop(default=vec![])] else_if: Vec<ElseIf>,
#[prop(optional)] fallback: Option<Fallback>,
) -> impl IntoView {
move || {
if cond.get() {
(then.children)(cx).into_view(cx)
} else if let Some(else_if) = else_if.iter().find(|i| i.cond.get()) {
(else_if.children)(cx).into_view(cx)
} else if let Some(fallback) = &fallback {
(fallback.children)(cx).into_view(cx)
} else {
().into_view(cx)
}
}
}

View file

@ -1,3 +1,11 @@
mod if_comp;
mod option_comp;
pub use option_comp::*;
pub use if_comp::*;
use leptos::*;
pub use option_comp::*;
#[slot]
pub struct Fallback {
children: ChildrenFn,
}

View file

@ -1,13 +1,21 @@
use super::Fallback;
use leptos::*;
#[component]
pub fn OptionComp<T, VF, IV>(cx: Scope, value: Option<T>, view: VF) -> impl IntoView
pub fn OptionComp<T, VF, IV>(
cx: Scope,
value: Option<T>,
view: VF,
#[prop(optional)] fallback: Option<Fallback>,
) -> impl IntoView
where
VF: Fn(Scope, T) -> IV + 'static,
IV: IntoView,
{
if let Some(value) = value {
view(cx, value).into_view(cx)
} else if let Some(fallback) = &fallback {
(fallback.children)(cx).into_view(cx)
} else {
().into_view(cx)
}