From 5a70c6ecf983b764ba7c0dc4ec5b1d4171190f70 Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Thu, 22 Dec 2022 14:45:48 -0500 Subject: [PATCH] chore: swap over router none --- examples/button.rs | 11 +++++++++++ packages/core/src/arena.rs | 17 ++++++++++++----- packages/router/src/components/redirect.rs | 2 +- packages/router/src/components/route.rs | 2 +- packages/ssr/src/renderer.rs | 4 ++-- 5 files changed, 27 insertions(+), 9 deletions(-) create mode 100644 examples/button.rs diff --git a/examples/button.rs b/examples/button.rs new file mode 100644 index 000000000..9d32819e8 --- /dev/null +++ b/examples/button.rs @@ -0,0 +1,11 @@ +use dioxus::prelude::*; + +fn main() { + dioxus_desktop::launch(app); +} + +fn app(cx: Scope) -> Element { + cx.render(rsx! { + button { "hello, desktop!" } + }) +} diff --git a/packages/core/src/arena.rs b/packages/core/src/arena.rs index 27b3a048a..8d64cfa08 100644 --- a/packages/core/src/arena.rs +++ b/packages/core/src/arena.rs @@ -136,8 +136,10 @@ impl VirtualDom { } /// Descend through the tree, removing any borrowed props and listeners - pub(crate) fn ensure_drop_safety(&self, scope: ScopeId) { - let scope = &self.scopes[scope.0]; + pub(crate) fn ensure_drop_safety(&self, scope_id: ScopeId) { + let scope = &self.scopes[scope_id.0]; + + log::debug!("Dropping props on scope {:?}", scope_id); // make sure we drop all borrowed props manually to guarantee that their drop implementation is called before we // run the hooks (which hold an &mut Reference) @@ -145,10 +147,15 @@ impl VirtualDom { let mut props = scope.borrowed_props.borrow_mut(); props.drain(..).for_each(|comp| { let comp = unsafe { &*comp }; - if let Some(scope_id) = comp.scope.get() { - self.ensure_drop_safety(scope_id); + match comp.scope.get() { + Some(child) if child != scope_id => self.ensure_drop_safety(child), + _ => (), + } + if let Ok(mut props) = comp.props.try_borrow_mut() { + *props = None; + } else { + log::debug!("cannot drop props for comp {:?}", scope_id); } - drop(comp.props.take()); }); // Now that all the references are gone, we can safely drop our own references in our listeners. diff --git a/packages/router/src/components/redirect.rs b/packages/router/src/components/redirect.rs index a1858c318..3bbe50b7e 100644 --- a/packages/router/src/components/redirect.rs +++ b/packages/router/src/components/redirect.rs @@ -47,5 +47,5 @@ pub fn Redirect<'a>(cx: Scope<'a, RedirectProps<'a>>) -> Element { router.replace_route(cx.props.to, None, None); } - None + cx.render(rsx!(())) } diff --git a/packages/router/src/components/route.rs b/packages/router/src/components/route.rs index 37dbe4d26..cf665d2e1 100644 --- a/packages/router/src/components/route.rs +++ b/packages/router/src/components/route.rs @@ -52,6 +52,6 @@ pub fn Route<'a>(cx: Scope<'a, RouteProps<'a>>) -> Element { cx.render(rsx!(&cx.props.children)) } else { log::debug!("Route should *not* render: {:?}", cx.scope_id()); - None + cx.render(rsx!(())) } } diff --git a/packages/ssr/src/renderer.rs b/packages/ssr/src/renderer.rs index 608c6a6d4..1417684ac 100644 --- a/packages/ssr/src/renderer.rs +++ b/packages/ssr/src/renderer.rs @@ -51,7 +51,7 @@ impl Renderer { ) -> std::fmt::Result { // We should never ever run into async or errored nodes in SSR // Error boundaries and suspense boundaries will convert these to sync - if let RenderReturn::Sync(Some(node)) = dom.get_scope(scope).unwrap().root_node() { + if let RenderReturn::Ready(node) = dom.get_scope(scope).unwrap().root_node() { self.render_template(buf, dom, node)? }; @@ -89,7 +89,7 @@ impl Renderer { let scope = dom.get_scope(id).unwrap(); let node = scope.root_node(); match node { - RenderReturn::Sync(Some(node)) => { + RenderReturn::Ready(node) => { self.render_template(buf, dom, node)? } _ => todo!(