chore: make for loops not the same

This commit is contained in:
Jonathan Kelley 2022-11-17 22:55:46 -08:00
parent 20f9957fbe
commit 6c677e64da
4 changed files with 33 additions and 29 deletions

View file

@ -4,6 +4,7 @@ use std::collections::HashMap;
fn main() {
dioxus_desktop::launch(|cx| {
cx.render(rsx! {
h1 {"Loading...."}
app_root {}
})
});
@ -16,6 +17,7 @@ struct ListBreeds {
async fn app_root(cx: Scope<'_>) -> Element {
let breed = use_state(cx, || "deerhound".to_string());
let breeds = use_future!(cx, || async move {
reqwest::get("https://dog.ceo/api/breeds/list/all")
.await
@ -31,7 +33,6 @@ async fn app_root(cx: Scope<'_>) -> Element {
div { display: "flex",
ul { flex: "50%",
for cur_breed in breeds.message.keys().take(10) {
rsx! {
li { key: "{cur_breed}",
button {
onclick: move |_| breed.set(cur_breed.clone()),
@ -40,10 +41,7 @@ async fn app_root(cx: Scope<'_>) -> Element {
}
}
}
}
div { flex: "50%",
breed_pic { breed: breed.to_string() }
}
div { flex: "50%", breed_pic { breed: breed.to_string() } }
}
}
}),

View file

@ -20,9 +20,9 @@ fn app(cx: Scope) -> Element {
// Use optionals
Some(rsx! { "Some" }),
// use a for loop
// use a for loop where the body itself is RSX
for name in 0..10 {
rsx! { "{name}" }
div {"{name}"}
}
// Or even use an unterminated conditional

View file

@ -44,9 +44,9 @@ impl DesktopController {
.build()
.unwrap();
runtime.block_on(async move {
let mut dom = VirtualDom::new_with_props(root, props)
.with_root_context(DesktopContext::new(desktop_context_proxy));
{
let edits = dom.rebuild();
let mut queue = edit_queue.lock().unwrap();
@ -55,7 +55,6 @@ impl DesktopController {
proxy.send_event(UserWindowEvent::Update).unwrap();
}
runtime.block_on(async move {
loop {
tokio::select! {
_ = dom.wait_for_work() => {}

View file

@ -3,9 +3,10 @@ use super::*;
use proc_macro2::{Span, TokenStream as TokenStream2};
use quote::{quote, ToTokens, TokenStreamExt};
use syn::{
braced,
parse::{Parse, ParseStream},
spanned::Spanned,
token, Block, Expr, ExprIf, LitStr, Pat, Result,
token, Expr, ExprIf, LitStr, Pat, Result,
};
/*
@ -98,14 +99,20 @@ impl Parse for BodyNode {
let pat = stream.parse::<Pat>()?;
let _i = stream.parse::<Token![in]>()?;
let expr = stream.parse::<Box<Expr>>()?;
let body = stream.parse::<Block>()?;
let body;
braced!(body in stream);
let mut children = vec![];
while !body.is_empty() {
children.push(body.parse()?);
}
return Ok(BodyNode::ForLoop(ForLoop {
for_token: _f,
pat,
in_token: _i,
expr,
body,
body: children,
}));
}
@ -134,11 +141,11 @@ impl ToTokens for BodyNode {
pat, expr, body, ..
} = exp;
let renderer = TemplateRenderer { roots: &body };
tokens.append_all(quote! {
__cx.fragment_from_iter(
(#expr).into_iter().map(|#pat| {
#body
})
(#expr).into_iter().map(|#pat| { #renderer })
)
})
}
@ -213,7 +220,7 @@ pub struct ForLoop {
pub pat: Pat,
pub in_token: Token![in],
pub expr: Box<Expr>,
pub body: Block,
pub body: Vec<BodyNode>,
}
fn is_if_chain_terminated(chain: &ExprIf) -> bool {