2021-02-21 03:57:13 +00:00
|
|
|
//! Demonstrate that borrowed data is possible as a property type
|
|
|
|
//! Borrowing (rather than cloning) is very important for speed and ergonomics.
|
2021-02-22 18:10:36 +00:00
|
|
|
//!
|
|
|
|
//! It's slightly more advanced than just cloning, but well worth the investment.
|
|
|
|
//!
|
|
|
|
//! If you use the FC macro, we handle the lifetimes automatically, making it easy to write efficient & performant components.
|
2021-02-21 03:57:13 +00:00
|
|
|
|
|
|
|
fn main() {}
|
|
|
|
|
|
|
|
use dioxus_core::prelude::*;
|
|
|
|
|
|
|
|
struct Props {
|
|
|
|
items: Vec<ListItem>,
|
|
|
|
}
|
|
|
|
|
|
|
|
struct ListItem {
|
|
|
|
name: String,
|
|
|
|
age: u32,
|
|
|
|
}
|
|
|
|
|
|
|
|
fn app(ctx: Context, props: &Props) -> DomTree {
|
2021-03-01 02:21:17 +00:00
|
|
|
let (f, setter) = use_state(&ctx, || 0);
|
|
|
|
|
|
|
|
ctx.render(move |b| {
|
2021-03-03 16:13:46 +00:00
|
|
|
let mut root = builder::ElementBuilder::new(b, "div");
|
2021-02-21 03:57:13 +00:00
|
|
|
for child in &props.items {
|
|
|
|
// notice that the child directly borrows from our vec
|
|
|
|
// this makes lists very fast (simply views reusing lifetimes)
|
|
|
|
root = root.child(builder::virtual_child(
|
2021-03-03 16:13:46 +00:00
|
|
|
b.bump,
|
2021-03-01 02:21:17 +00:00
|
|
|
ChildProps {
|
|
|
|
item: child,
|
|
|
|
item_handler: setter,
|
|
|
|
},
|
|
|
|
// <ChildItem item=child hanldler=setter />
|
2021-02-21 03:57:13 +00:00
|
|
|
child_item,
|
|
|
|
));
|
|
|
|
}
|
|
|
|
root.finish()
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2021-03-01 02:21:17 +00:00
|
|
|
type StateSetter<T> = dyn Fn(T);
|
|
|
|
|
2021-02-21 03:57:13 +00:00
|
|
|
struct ChildProps<'a> {
|
2021-03-01 02:21:17 +00:00
|
|
|
// Pass down complex structs
|
2021-02-21 03:57:13 +00:00
|
|
|
item: &'a ListItem,
|
2021-03-01 02:21:17 +00:00
|
|
|
|
|
|
|
// Even pass down handlers!
|
|
|
|
item_handler: &'a StateSetter<i32>,
|
2021-02-21 03:57:13 +00:00
|
|
|
}
|
|
|
|
|
2021-03-01 02:21:17 +00:00
|
|
|
fn child_item(ctx: Context, props: &ChildProps) -> DomTree {
|
2021-02-21 03:57:13 +00:00
|
|
|
todo!()
|
2021-03-01 02:21:17 +00:00
|
|
|
// ctx.render(rsx! {
|
|
|
|
// div {
|
|
|
|
// item: child,
|
|
|
|
// handler: setter,
|
|
|
|
// abc: 123,
|
|
|
|
// onclick: props.item_handler,
|
|
|
|
|
|
|
|
// h1 { "abcd123" }
|
|
|
|
// h2 { "abcd123" }
|
|
|
|
// div {
|
|
|
|
// "abcd123"
|
|
|
|
// h2 { }
|
|
|
|
// p { }
|
|
|
|
// },
|
|
|
|
// }
|
|
|
|
// })
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rsx! {
|
|
|
|
ChildItem {
|
|
|
|
// props
|
|
|
|
item: child, handler: setter,
|
|
|
|
|
|
|
|
// children
|
|
|
|
div { class:"abcd", abc: 123 },
|
|
|
|
div { class:"abcd", abc: 123 },
|
|
|
|
|
|
|
|
// Auto-text coercion
|
|
|
|
"eyo matie {abc}",
|
|
|
|
|
|
|
|
// Anything that accepts Into<VChild>
|
|
|
|
{},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// dreaming of this syntax
|
|
|
|
#[derive(Properties)]
|
|
|
|
struct ChildProps<'a> {
|
|
|
|
username: &'a str,
|
|
|
|
item_handler: &'a dyn Fn(i32),
|
|
|
|
}
|
|
|
|
|
|
|
|
fn child_item(ctx: Context, props: &ChildProps) -> DomTree {
|
|
|
|
ctx.render(rsx! {
|
|
|
|
div {
|
|
|
|
class: "abc123",
|
|
|
|
abc: 123,
|
|
|
|
onclick: props.item_handler,
|
|
|
|
|
|
|
|
h1 { "Hello, {props.username}!" },
|
|
|
|
h2 { "Welcome the RSX syntax" },
|
|
|
|
div {
|
|
|
|
h3 { "This is a subheader" }
|
|
|
|
button {
|
|
|
|
onclick: props.handler,
|
|
|
|
"This is a button"
|
|
|
|
}
|
|
|
|
"This is child text"
|
|
|
|
},
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// This is also nice
|
|
|
|
|
|
|
|
#[dioxus::component]
|
|
|
|
static CHILD: FC = |ctx, username: &str, handler: &dyn Fn(i32)| {
|
|
|
|
ctx.render(rsx! {
|
|
|
|
div {
|
|
|
|
class: "abc123",
|
|
|
|
abc: 123,
|
|
|
|
onclick: handler,
|
|
|
|
|
|
|
|
h1 { "Hello, {username}!" },
|
|
|
|
h2 { "Welcome the RSX syntax" },
|
|
|
|
div {
|
|
|
|
h3 { "This is a subheader" }
|
|
|
|
button {
|
|
|
|
onclick: props.handler,
|
|
|
|
"This is a button"
|
|
|
|
}
|
|
|
|
"This is child text"
|
|
|
|
},
|
|
|
|
}
|
|
|
|
})
|
2021-02-21 03:57:13 +00:00
|
|
|
}
|
2021-03-01 02:21:17 +00:00
|
|
|
Menlo, Monaco, 'Courier New', monospace
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct Item {
|
|
|
|
name: String,
|
|
|
|
content: String,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[dioxus::live_component]
|
|
|
|
static CHILD: FC = |ctx, username: &str, handler: &dyn Fn(i32)| {
|
|
|
|
// return lazy nodes or
|
|
|
|
let ssr = ctx.suspend(async {
|
|
|
|
let data = fetch("https://google.com")
|
|
|
|
.await?
|
|
|
|
.json::<Item>()
|
|
|
|
.await?;
|
|
|
|
rsx! {
|
|
|
|
div {
|
|
|
|
h1 { "Welcome: {data.name}" }
|
|
|
|
p { "Content: \n {data.content}" }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
ctx.render(rsx! {
|
|
|
|
div {
|
|
|
|
class: "abc123",
|
|
|
|
abc: 123,
|
|
|
|
onclick: handler,
|
|
|
|
|
|
|
|
h1 { "Hello, {username}!" },
|
|
|
|
h2 { "Welcome the RSX syntax" },
|
|
|
|
div {
|
|
|
|
h3 { "This is a subheader" }
|
|
|
|
button {
|
|
|
|
onclick: props.handler,
|
|
|
|
"This is a button"
|
|
|
|
}
|
|
|
|
{ssr}
|
|
|
|
},
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
*/
|