Function leptos::For

source ·
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.