From e819702fc516c79a813e0d82bad23998e572a49b Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Tue, 17 Oct 2023 15:42:21 -0700 Subject: [PATCH] Add into_vnode temporary logic for more things This commit adjusts how rsx! works, making it more forgiving with signals. Notably, we add the temporaries to if chains too. --- examples/signals.rs | 13 +++++++++++-- packages/core/src/lib.rs | 6 +++--- packages/rsx/src/node.rs | 14 +++++++++----- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/examples/signals.rs b/examples/signals.rs index c16bfe927..559c3f5ce 100644 --- a/examples/signals.rs +++ b/examples/signals.rs @@ -8,8 +8,10 @@ fn main() { fn app(cx: Scope) -> Element { let running = dioxus_signals::use_signal(cx, || true); let mut count = dioxus_signals::use_signal(cx, || 0); - let saved_values = dioxus_signals::use_signal(cx, || vec![0]); + let saved_values = dioxus_signals::use_signal(cx, || vec![0.to_string()]); + // Signals can be used in async functions without an explicit clone since they're 'static and Copy + // Signals are backed by a runtime that is designed to deeply integrate with Dioxus apps use_future!(cx, || async move { loop { if running.value() { @@ -24,7 +26,7 @@ fn app(cx: Scope) -> Element { button { onclick: move |_| count += 1, "Up high!" } button { onclick: move |_| count -= 1, "Down low!" } button { onclick: move |_| running.toggle(), "Toggle counter" } - button { onclick: move |_| saved_values.push(count.value()), "Save this value" } + button { onclick: move |_| saved_values.push(count.value().to_string()), "Save this value" } // We can do boolean operations on the current signal value if count.value() > 5 { @@ -35,5 +37,12 @@ fn app(cx: Scope) -> Element { for value in saved_values.read().iter() { h3 { "Saved value: {value}" } } + + // We can also use the signal value as a slice + if let &[ref first, .., ref last] = saved_values.read().as_slice() { + rsx! { li { "single element: {first}, {last}" } } + } else { + rsx! { "No saved values" } + } }) } diff --git a/packages/core/src/lib.rs b/packages/core/src/lib.rs index ee557af2d..392774767 100644 --- a/packages/core/src/lib.rs +++ b/packages/core/src/lib.rs @@ -91,9 +91,9 @@ pub mod prelude { consume_context, consume_context_from_scope, current_scope_id, fc_to_builder, has_context, provide_context, provide_context_to_scope, provide_root_context, push_future, remove_future, schedule_update_any, spawn, spawn_forever, suspend, throw, AnyValue, - Component, Element, Event, EventHandler, Fragment, IntoAttributeValue, LazyNodes, - Properties, Runtime, RuntimeGuard, Scope, ScopeId, ScopeState, Scoped, TaskId, Template, - TemplateAttribute, TemplateNode, Throw, VNode, VirtualDom, + Component, Element, Event, EventHandler, Fragment, IntoAttributeValue, IntoDynNode, + LazyNodes, Properties, Runtime, RuntimeGuard, Scope, ScopeId, ScopeState, Scoped, TaskId, + Template, TemplateAttribute, TemplateNode, Throw, VNode, VirtualDom, }; } diff --git a/packages/rsx/src/node.rs b/packages/rsx/src/node.rs index 9c2f7b330..ed5e0bff4 100644 --- a/packages/rsx/src/node.rs +++ b/packages/rsx/src/node.rs @@ -126,8 +126,7 @@ impl ToTokens for BodyNode { }), BodyNode::RawExpr(exp) => tokens.append_all(quote! { { - use ::dioxus::core::IntoDynNode; - let ___nodes =(#exp).into_vnode(__cx); + let ___nodes = (#exp).into_vnode(__cx); ___nodes } }), @@ -146,7 +145,6 @@ impl ToTokens for BodyNode { // And then we can return them into the dyn loop tokens.append_all(quote! { { - use ::dioxus::core::IntoDynNode; let ___nodes =(#expr).into_iter().map(|#pat| { #renderer }).into_vnode(__cx); ___nodes } @@ -155,7 +153,10 @@ impl ToTokens for BodyNode { BodyNode::IfChain(chain) => { if is_if_chain_terminated(chain) { tokens.append_all(quote! { - __cx.make_node(#chain) + { + let ___nodes = (#chain).into_vnode(__cx); + ___nodes + } }); } else { let ExprIf { @@ -209,7 +210,10 @@ impl ToTokens for BodyNode { }); tokens.append_all(quote! { - __cx.make_node(#body) + { + let ___nodes = (#body).into_vnode(__cx); + ___nodes + } }); } }