mirror of
https://github.com/DioxusLabs/dioxus
synced 2024-12-27 13:03:09 +00:00
508c560320
This change switches back to the original `ctx<props>` syntax for commponents. This lets lifetime elision to remove the need to match exactly which lifetime (props or ctx) gets carried to the output. As such, `Props` is currently required to be static. It *is* possible to loosen this restriction, and will be done in the future, though only through adding metadata about the props through the Props derive macro. Implementing the IS_STATIC trait is unsafe, so the derive macro will do it through some heuristics. For now, this unlocks sharing vnodes from parents to children, enabling pass-thru components, fragments, portals, etc.
49 lines
1.4 KiB
Rust
49 lines
1.4 KiB
Rust
use crate::{
|
|
filtertoggles,
|
|
recoil::use_atom,
|
|
state::{FilterState, TodoItem, FILTER, TODOS},
|
|
todoitem::TodoEntry,
|
|
};
|
|
use dioxus_core::prelude::*;
|
|
|
|
pub fn TodoList(ctx: Context<()>) -> VNode {
|
|
let (draft, set_draft) = use_state(&ctx, || "".to_string());
|
|
let (todos, _) = use_state(&ctx, || Vec::<TodoItem>::new());
|
|
let filter = use_atom(&ctx, &FILTER);
|
|
|
|
ctx.render(rsx! {
|
|
div {
|
|
header {
|
|
class: "header"
|
|
h1 {"todos"}
|
|
input {
|
|
class: "new-todo"
|
|
placeholder: "What needs to be done?"
|
|
value: "{draft}"
|
|
oninput: move |evt| set_draft(evt.value)
|
|
}
|
|
}
|
|
|
|
{ // list
|
|
todos
|
|
.iter()
|
|
.filter(|item| match filter {
|
|
FilterState::All => true,
|
|
FilterState::Active => !item.checked,
|
|
FilterState::Completed => item.checked,
|
|
})
|
|
.map(|item| {
|
|
rsx!(TodoEntry {
|
|
key: "{order}",
|
|
id: item.id,
|
|
})
|
|
})
|
|
}
|
|
|
|
// filter toggle (show only if the list isn't empty)
|
|
{(!todos.is_empty()).then(||
|
|
rsx!( filtertoggles::FilterToggles {})
|
|
)}
|
|
}
|
|
})
|
|
}
|