diff --git a/packages/core-macro/src/rsx/body.rs b/packages/core-macro/src/rsx/body.rs index 34c16fb86..cafdb696b 100644 --- a/packages/core-macro/src/rsx/body.rs +++ b/packages/core-macro/src/rsx/body.rs @@ -43,7 +43,7 @@ impl ToTokens for CallBody { quote! {#inner} } else { let childs = &self.roots; - quote! { __cx.fragment_from_iter([ #(#childs),* ]) } + quote! { __cx.fragment_root([ #(#childs),* ]) } }; match &self.custom_context { diff --git a/packages/core/src/nodes.rs b/packages/core/src/nodes.rs index d7dcd5309..bba4ad1f0 100644 --- a/packages/core/src/nodes.rs +++ b/packages/core/src/nodes.rs @@ -643,6 +643,29 @@ impl<'a> NodeFactory<'a> { } } + pub fn fragment_root<'b, 'c>( + self, + node_iter: impl IntoIterator + 'c> + 'b, + ) -> VNode<'a> { + let bump = self.bump; + let mut nodes = bumpalo::collections::Vec::new_in(bump); + + for node in node_iter { + nodes.push(node.into_vnode(self)); + } + + if nodes.is_empty() { + nodes.push(VNode::Anchor(bump.alloc(VAnchor { + dom_id: empty_cell(), + }))); + } + + VNode::Fragment(VFragment { + children: nodes.into_bump_slice(), + key: None, + }) + } + pub fn fragment_from_iter<'b, 'c>( self, node_iter: impl IntoIterator + 'c> + 'b, @@ -665,20 +688,17 @@ impl<'a> NodeFactory<'a> { // todo: add a backtrace if cfg!(debug_assertions) && children.len() > 1 && children.last().unwrap().key().is_none() { - // todo: rsx! calls get turned into fragments which means they always trip this error - // - // - // use backtrace::Backtrace; - // let bt = Backtrace::new(); - + use backtrace::Backtrace; + let bt = Backtrace::new(); log::error!( r#" Warning: Each child in an array or iterator should have a unique "key" prop. Not providing a key will lead to poor performance with lists. See docs.rs/dioxus for more information. ------------- + {:?} "#, - // bt + bt ); } diff --git a/packages/core/src/scope.rs b/packages/core/src/scope.rs index 9c79a82a0..4a2eabd68 100644 --- a/packages/core/src/scope.rs +++ b/packages/core/src/scope.rs @@ -347,11 +347,11 @@ impl Scope { /// cx.render(lazy_tree) /// } ///``` - pub fn render<'src>(&'src self, lazy_nodes: Option>) -> Option { + pub fn render<'src>(&'src self, rsx: Option>) -> Option { let frame = self.wip_frame(); let bump = &frame.bump; let factory = NodeFactory { bump }; - let node = lazy_nodes.map(|f| f.call(factory))?; + let node = rsx.map(|f| f.call(factory))?; let node = bump.alloc(node); let node_ptr = node as *mut _; diff --git a/packages/desktop/src/lib.rs b/packages/desktop/src/lib.rs index f40752906..817e20499 100644 --- a/packages/desktop/src/lib.rs +++ b/packages/desktop/src/lib.rs @@ -54,11 +54,6 @@ pub fn launch_with_props( run(root, props, builder) } -#[derive(Serialize)] -enum RpcEvent<'a> { - Initialize { edits: Vec> }, -} - #[derive(Serialize)] struct Response<'a> { pre_rendered: Option, @@ -74,7 +69,7 @@ pub fn run( let mut cfg = DesktopConfig::new(); user_builder(&mut cfg); let DesktopConfig { - window, + window: window_cfg, manual_edits, pre_rendered, .. @@ -100,7 +95,7 @@ pub fn run( match window_event { Event::NewEvents(StartCause::Init) => { - let window = create_window(event_loop); + let window = create_window(event_loop, &window_cfg); let window_id = window.id(); let sender = launch_vdom_with_tokio(root, props_shared.take().unwrap(), edit_queue.clone()); @@ -234,13 +229,9 @@ fn build_menu() -> MenuBar { menu_bar_menu } -fn create_window(event_loop: &EventLoopWindowTarget<()>) -> Window { - WindowBuilder::new() - .with_maximized(true) - .with_menu(build_menu()) - .with_title("Dioxus App") - .build(event_loop) - .unwrap() +fn create_window(event_loop: &EventLoopWindowTarget<()>, cfg: &WindowBuilder) -> Window { + let builder = cfg.clone().with_menu(build_menu()); + builder.build(event_loop).unwrap() } fn create_webview( @@ -264,7 +255,7 @@ fn create_webview( } _ => {} } - + // always driven through eval None }) // Any content that that uses the `wry://` scheme will be shuttled through this handler as a "special case" diff --git a/packages/html/src/elements.rs b/packages/html/src/elements.rs index 6406e54c8..38797ed6d 100644 --- a/packages/html/src/elements.rs +++ b/packages/html/src/elements.rs @@ -682,8 +682,35 @@ builder_constructors! { /// Build a /// [`