mirror of
https://github.com/leptos-rs/leptos
synced 2024-11-14 00:27:12 +00:00
feat: Rc
-backed ChildrenFn
(#1669)
This commit is contained in:
parent
de44b1f91f
commit
b3a4c95dad
7 changed files with 72 additions and 20 deletions
62
leptos/src/children.rs
Normal file
62
leptos/src/children.rs
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
use leptos_dom::Fragment;
|
||||||
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
/// The most common type for the `children` property on components,
|
||||||
|
/// which can only be called once.
|
||||||
|
pub type Children = Box<dyn FnOnce() -> Fragment>;
|
||||||
|
|
||||||
|
/// A type for the `children` property on components that can be called
|
||||||
|
/// more than once.
|
||||||
|
pub type ChildrenFn = Rc<dyn Fn() -> Fragment>;
|
||||||
|
|
||||||
|
/// A type for the `children` property on components that can be called
|
||||||
|
/// more than once, but may mutate the children.
|
||||||
|
pub type ChildrenFnMut = Box<dyn FnMut() -> Fragment>;
|
||||||
|
|
||||||
|
// This is to still support components that accept `Box<dyn Fn() -> Fragment>` as a children.
|
||||||
|
type BoxedChildrenFn = Box<dyn Fn() -> Fragment>;
|
||||||
|
|
||||||
|
#[doc(hidden)]
|
||||||
|
pub trait ToChildren<F> {
|
||||||
|
fn to_children(f: F) -> Self;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F> ToChildren<F> for Children
|
||||||
|
where
|
||||||
|
F: FnOnce() -> Fragment + 'static,
|
||||||
|
{
|
||||||
|
#[inline]
|
||||||
|
fn to_children(f: F) -> Self {
|
||||||
|
Box::new(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F> ToChildren<F> for ChildrenFn
|
||||||
|
where
|
||||||
|
F: Fn() -> Fragment + 'static,
|
||||||
|
{
|
||||||
|
#[inline]
|
||||||
|
fn to_children(f: F) -> Self {
|
||||||
|
Rc::new(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F> ToChildren<F> for ChildrenFnMut
|
||||||
|
where
|
||||||
|
F: FnMut() -> Fragment + 'static,
|
||||||
|
{
|
||||||
|
#[inline]
|
||||||
|
fn to_children(f: F) -> Self {
|
||||||
|
Box::new(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F> ToChildren<F> for BoxedChildrenFn
|
||||||
|
where
|
||||||
|
F: Fn() -> Fragment + 'static,
|
||||||
|
{
|
||||||
|
#[inline]
|
||||||
|
fn to_children(f: F) -> Self {
|
||||||
|
Box::new(f)
|
||||||
|
}
|
||||||
|
}
|
|
@ -204,20 +204,10 @@ pub use typed_builder;
|
||||||
pub use typed_builder::Optional;
|
pub use typed_builder::Optional;
|
||||||
#[doc(hidden)]
|
#[doc(hidden)]
|
||||||
pub use typed_builder_macro;
|
pub use typed_builder_macro;
|
||||||
|
mod children;
|
||||||
|
pub use children::*;
|
||||||
extern crate self as leptos;
|
extern crate self as leptos;
|
||||||
|
|
||||||
/// The most common type for the `children` property on components,
|
|
||||||
/// which can only be called once.
|
|
||||||
pub type Children = Box<dyn FnOnce() -> Fragment>;
|
|
||||||
|
|
||||||
/// A type for the `children` property on components that can be called
|
|
||||||
/// more than once.
|
|
||||||
pub type ChildrenFn = Box<dyn Fn() -> Fragment>;
|
|
||||||
|
|
||||||
/// A type for the `children` property on components that can be called
|
|
||||||
/// more than once, but may mutate the children.
|
|
||||||
pub type ChildrenFnMut = Box<dyn FnMut() -> Fragment>;
|
|
||||||
|
|
||||||
/// A type for taking anything that implements [`IntoAttribute`].
|
/// A type for taking anything that implements [`IntoAttribute`].
|
||||||
///
|
///
|
||||||
/// ```rust
|
/// ```rust
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
use leptos::component;
|
use leptos::{component, ChildrenFn};
|
||||||
use leptos_dom::{Fragment, IntoView};
|
use leptos_dom::IntoView;
|
||||||
use leptos_reactive::{create_memo, signal_prelude::*};
|
use leptos_reactive::{create_memo, signal_prelude::*};
|
||||||
|
|
||||||
/// A component that will show its children when the `when` condition is `true`,
|
/// A component that will show its children when the `when` condition is `true`,
|
||||||
|
@ -38,7 +38,7 @@ pub fn Show<F, W, IV>(
|
||||||
/// The scope the component is running in
|
/// The scope the component is running in
|
||||||
|
|
||||||
/// The components Show wraps
|
/// The components Show wraps
|
||||||
children: Box<dyn Fn() -> Fragment>,
|
children: ChildrenFn,
|
||||||
/// A closure that returns a bool that determines whether this thing runs
|
/// A closure that returns a bool that determines whether this thing runs
|
||||||
when: W,
|
when: W,
|
||||||
/// A closure that returns what gets rendered if the when statement is false
|
/// A closure that returns what gets rendered if the when statement is false
|
||||||
|
|
|
@ -61,14 +61,14 @@ pub fn Suspense<F, E, V>(
|
||||||
/// Returns a fallback UI that will be shown while `async` [`Resource`](leptos_reactive::Resource)s are still loading.
|
/// Returns a fallback UI that will be shown while `async` [`Resource`](leptos_reactive::Resource)s are still loading.
|
||||||
fallback: F,
|
fallback: F,
|
||||||
/// Children will be displayed once all `async` [`Resource`](leptos_reactive::Resource)s have resolved.
|
/// Children will be displayed once all `async` [`Resource`](leptos_reactive::Resource)s have resolved.
|
||||||
children: Box<dyn Fn() -> V>,
|
children: Rc<dyn Fn() -> V>,
|
||||||
) -> impl IntoView
|
) -> impl IntoView
|
||||||
where
|
where
|
||||||
F: Fn() -> E + 'static,
|
F: Fn() -> E + 'static,
|
||||||
E: IntoView,
|
E: IntoView,
|
||||||
V: IntoView + 'static,
|
V: IntoView + 'static,
|
||||||
{
|
{
|
||||||
let orig_children = Rc::new(children);
|
let orig_children = children;
|
||||||
let context = SuspenseContext::new();
|
let context = SuspenseContext::new();
|
||||||
|
|
||||||
#[cfg(not(any(feature = "csr", feature = "hydrate")))]
|
#[cfg(not(any(feature = "csr", feature = "hydrate")))]
|
||||||
|
|
|
@ -114,7 +114,7 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.children(Box::new(move || {
|
.children(Rc::new(move || {
|
||||||
let frag = children().into_view();
|
let frag = children().into_view();
|
||||||
|
|
||||||
if let Some(suspense_context) = use_context::<SuspenseContext>()
|
if let Some(suspense_context) = use_context::<SuspenseContext>()
|
||||||
|
|
|
@ -124,7 +124,7 @@ pub(crate) fn component_to_tokens(
|
||||||
.children({
|
.children({
|
||||||
#(#clonables)*
|
#(#clonables)*
|
||||||
|
|
||||||
Box::new(move || #children #view_marker)
|
::leptos::ToChildren::to_children(move || #children #view_marker)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -130,7 +130,7 @@ pub(crate) fn slot_to_tokens(
|
||||||
.children({
|
.children({
|
||||||
#(#clonables)*
|
#(#clonables)*
|
||||||
|
|
||||||
Box::new(move || #children #view_marker)
|
::leptos::ToChildren::to_children(move || #children #view_marker)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue