diff --git a/packages/core-macro/src/lib.rs b/packages/core-macro/src/lib.rs index 00dfecca7..1f702e825 100644 --- a/packages/core-macro/src/lib.rs +++ b/packages/core-macro/src/lib.rs @@ -189,8 +189,8 @@ pub fn rsx(s: TokenStream) -> TokenStream { use dioxus_rsx_interpreter::captuered_context::CapturedContextBuilder; match CapturedContextBuilder::from_call_body(body) { - Ok(captured) => quote::quote! { - { + Ok(captured) => { + let lazy = quote::quote! { LazyNodes::new(move |__cx|{ let captured = #captured; let line_num = get_line_num(); @@ -198,9 +198,16 @@ pub fn rsx(s: TokenStream) -> TokenStream { resolve_scope(line_num, text, captured, __cx) }) + }; + if let Some(cx) = captured.custom_context { + quote::quote! { + #cx.render(#lazy) + } + .into() + } else { + lazy.into() } } - .into(), Err(err) => err.into_compile_error().into(), } } diff --git a/packages/rsx_interpreter/Cargo.toml b/packages/rsx_interpreter/Cargo.toml index 172ce4975..3b13646ae 100644 --- a/packages/rsx_interpreter/Cargo.toml +++ b/packages/rsx_interpreter/Cargo.toml @@ -8,7 +8,7 @@ license = "MIT/Apache-2.0" syn = { version = "1.0", features = ["extra-traits"] } quote = "1.0" serde = { version = "1.0", features = ["derive"] } -serde_json = { vesion = "1.0" } +serde_json = "1.0" lazy_static = "1.4.0" dioxus-rsx = { path = "../rsx", default-features = false } diff --git a/packages/rsx_interpreter/src/captuered_context.rs b/packages/rsx_interpreter/src/captuered_context.rs index 530993532..68969b4a9 100644 --- a/packages/rsx_interpreter/src/captuered_context.rs +++ b/packages/rsx_interpreter/src/captuered_context.rs @@ -4,7 +4,7 @@ use dioxus_rsx::{ }; use quote::{quote, ToTokens, TokenStreamExt}; use std::collections::HashMap; -use syn::{Expr, Result}; +use syn::{Expr, Ident, Result}; #[derive(Default)] pub struct CapturedContextBuilder { @@ -14,6 +14,7 @@ pub struct CapturedContextBuilder { pub iterators: Vec, pub captured_expressions: Vec, pub listeners: Vec, + pub custom_context: Option, } impl CapturedContextBuilder { @@ -28,6 +29,7 @@ impl CapturedContextBuilder { pub fn from_call_body(body: CallBody) -> Result { let mut new = Self::default(); + new.custom_context = body.custom_context; for node in body.roots { new.extend(Self::find_captured(node)?); } @@ -86,6 +88,7 @@ impl ToTokens for CapturedContextBuilder { iterators, captured_expressions, listeners, + custom_context: _, } = self; let listeners_str = listeners .iter()