feat: improve FC handling to allow lifetimes of parent

This commit is contained in:
Jonathan Kelley committed 2021-10-30 21:07:47 -04:00
1 parent f70b5b4e4a
commit 6b2645fd80
3 files changed
+72 -37

No files matched your search

+1 -1
View File
@@ -1,3 +1,3 @@
{ {
"rust-analyzer.cargo.allFeatures": true // "rust-analyzer.cargo.allFeatures": true
} }
+46 -32
View File
@@ -252,39 +252,49 @@ fn Child2<'a>((cx, props): Scope<'a, Child2Props>) -> Element<'a> {
// - borrowed // - borrowed
// - memoized // - memoized
cx.render({ // cx.render({
NodeFactory::annotate_lazy(move |__cx: NodeFactory| -> VNode { // NodeFactory::annotate_lazy(move |__cx: NodeFactory| -> VNode {
use dioxus_elements::{GlobalAttributes, SvgAttributes}; // use dioxus_elements::{GlobalAttributes, SvgAttributes};
__cx.element( // __cx.element(
dioxus_elements::div, // dioxus_elements::div,
[], // [],
[], // [],
[], // [
// [__cx.component( // __cx.component(ChildrenMemo, (), None, []),
// ChildrenComp, // __cx.component(
// { // ChildrenComp,
// let mut __manual_props = ChildrenTest { node: children }; // //
// __manual_props // ChildrenTest { node: children },
// }, // None,
// None, // [],
// [], // ),
// )], // // {
None, // // let _props: &_ = __cx.bump().alloc(ChildrenTest { node: children });
) // // __cx.component_v2_borrowed(
}) // // //
}) // // move |c| ChildrenComp((c, _props)),
// cx.render(rsx! { // // ChildrenComp,
// div { // // _props,
// // div {} // // )
// // },
// ChildrenComp { // // {
// // node: children // // let _props: &_ = __cx.bump().alloc(());
// ..ChildrenTest { // // __cx.component_v2_borrowed(move |c| ChildrenMemo((c, _props)))
// node: children, // // },
// } // ],
// } // None,
// } // )
// })
// }) // })
cx.render(rsx! {
div {
ChildrenComp {
..ChildrenTest {
node: children,
}
}
}
})
} }
#[derive(Props)] #[derive(Props)]
@@ -333,3 +343,7 @@ fn ChildrenComp<'a>((cx, props): Scope<'a, ChildrenTest<'a>>) -> Element<'a> {
} }
}) })
} }
fn ChildrenMemo((cx, props): Scope<()>) -> Element {
todo!()
}
+25 -4
View File
@@ -4,7 +4,8 @@
//! cheap and *very* fast to construct - building a full tree should be quick. //! cheap and *very* fast to construct - building a full tree should be quick.
use crate::innerlude::{ use crate::innerlude::{
empty_cell, Context, Element, ElementId, Properties, ScopeId, ScopeInner, SuspendedContext, FC, empty_cell, Context, Element, ElementId, Properties, Scope, ScopeId, ScopeInner,
SuspendedContext, FC,
}; };
use bumpalo::{boxed::Box as BumpBox, Bump}; use bumpalo::{boxed::Box as BumpBox, Bump};
use std::{ use std::{
@@ -448,9 +449,26 @@ impl<'a> NodeFactory<'a> {
} }
} }
pub fn component_v2_borrowed<P: 'a>(
self,
f: impl Fn(Context<'a>) -> Option<VNode<'a>> + 'a,
fc: fn(Scope<'a, P>) -> Element<'a>,
p: &'a P,
) -> VNode<'a> {
//
todo!()
}
// pub fn component_v2_memoized(
// self,
// f: impl for<'b> Fn(Context<'b>) -> Option<VNode<'b>> + 'static,
// ) -> VNode<'a> {
// //
// todo!()
// }
pub fn component<P, V>( pub fn component<P, V>(
&self, &self,
component: FC<P>, component: fn(Scope<'a, P>) -> Element<'a>,
props: P, props: P,
key: Option<Arguments>, key: Option<Arguments>,
children: V, children: V,
@@ -458,7 +476,6 @@ impl<'a> NodeFactory<'a> {
where where
P: Properties + 'a, P: Properties + 'a,
V: AsRef<[VNode<'a>]> + 'a, V: AsRef<[VNode<'a>]> + 'a,
// V: 'a + AsRef<[VNode<'a>]>,
{ {
let bump = self.bump(); let bump = self.bump();
let children: &'a V = bump.alloc(children); let children: &'a V = bump.alloc(children);
@@ -523,7 +540,11 @@ impl<'a> NodeFactory<'a> {
bump.alloc(move |scope: &ScopeInner| -> Element { bump.alloc(move |scope: &ScopeInner| -> Element {
log::debug!("calling component renderr {:?}", scope.our_arena_idx); log::debug!("calling component renderr {:?}", scope.our_arena_idx);
let props: &'_ P = unsafe { &*(raw_props as *const P) }; let props: &'_ P = unsafe { &*(raw_props as *const P) };
let res: Element = component((Context { scope }, props));
let scp: &'a ScopeInner = unsafe { std::mem::transmute(scope) };
let s: Scope<'a, P> = (Context { scope: scp }, props);
let res: Element = component(s);
unsafe { std::mem::transmute(res) } unsafe { std::mem::transmute(res) }
}); });