diff --git a/docs/book/src/view/04b_iteration.md b/docs/book/src/view/04b_iteration.md index 0832b4e772..8af1aa3032 100644 --- a/docs/book/src/view/04b_iteration.md +++ b/docs/book/src/view/04b_iteration.md @@ -238,9 +238,9 @@ will be updated to this: each=move || data().into_iter().enumerate() key=|(_, state)| state.key.clone() children=move |(index, _)| { - let value = create_memo(move |_| { - data.with(|data| data[index].value) - }); + let value = create_memo(move |_| { + data.with(|data| data.get(index).map(|d| d.value).unwrap_or(0)) + }); view! {

{value}

} @@ -267,6 +267,12 @@ wrap the data in signals. ## Cons It’s a bit more complex to set up this memo-per-row inside the `` loop rather than -using nested signals. Note also that while memos memoize their reactive changes, the same +using nested signals. For example, you’ll notice that we have to guard against the possibility +that the `data[index]` would panic by using `data.get(index)`, because this memo may be +triggered to re-run once just after the row is removed. (This is because the memo for each row +and the whole `` both depend on the same `data` signal, and the order of execution for +multiple reactive values that depend on the same signal isn’t guaranteed.) + +Note also that while memos memoize their reactive changes, the same calculation does need to re-run to check the value every time, so nested reactive signals will still be more efficient for pinpoint updates here.