pub fn For<IF, I, T, EF, N, KF, K>(
cx: Scope,
props: ForProps<IF, I, T, EF, N, KF, K>
) -> impl IntoViewwhere
IF: Fn() -> I + 'static,
I: IntoIterator<Item = T>,
EF: Fn(Scope, T) -> N + 'static,
N: IntoView,
KF: Fn(&T) -> K + 'static,
K: Eq + Hash + 'static,
T: 'static,
Expand description
Iterates over children and displays them, keyed by the key
function given.
This is much more efficient than naively iterating over nodes with .iter().map(|n| view! { cx, ... })...
,
as it avoids re-creating DOM nodes that are not being changed.
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
struct Counter {
id: usize,
count: RwSignal<i32>
}
#[component]
fn Counters(cx: Scope) -> impl IntoView {
let (counters, set_counters) = create_signal::<Vec<Counter>>(cx, vec![]);
view! {
cx,
<div>
<For
// a function that returns the items we're iterating over; a signal is fine
each=counters
// a unique key for each item
key=|counter| counter.id
// renders each item to a view
view=move |cx, counter: Counter| {
view! {
cx,
<button>"Value: " {move || counter.count.get()}</button>
}
}
/>
</div>
}
}
Required Props
- cx:
Scope
- each: [
IF
]- Items over which the component should iterate.
- key: [
KF
]- A key function that will be applied to each item.
- view: [
EF
]- The view that will be displayed for each item.