For
Component for rendering lists that automatically updates when the array changes.
Signature
function For<T>(
items: () => Array<T>,
renderItem: (item: T, index: number) => Node
): Node;
Parameters
items: () => Array<T>
- Function that returns an array of items to renderrenderItem: (item: T, index: number) => Node
- Function to render each item
Returns
Node
- A DOM node containing all rendered items
Example
const [tasks, setTasks] = createSignal([
{ id: "I", text: "Inhale", completed: true },
{ id: "E", text: "Exhale", completed: true },
{ id: "R", text: "Repeat", completed: false },
]);
const template = html`
<div>
<h2>Todo List</h2>
<ul>
${For(
tasks,
(task, index) => html`
<li>
<input
type="checkbox"
checked="${task.completed}"
onchange="${() => console.log("toggleTask", task.id)}"
/>
<span>${index + 1}. ${task.text}</span>
<button onclick="${() => console.log("delTask", task.id)}">
X
</button>
</li>
`
)}
</ul>
</div>
`;
Advanced Usage
// Working with filter
const [fruits, setFruits] = createSignal([
{ id: "A", name: "Apple" },
{ id: "B", name: "Banana" },
{ id: "C", name: "Cherry" },
]);
const [filter, setFilter] = createSignal("");
const filteredFruits = createComputed(() => {
return fruits().filter((fruit) => fruit.name.includes(filter()));
});
const template = html`
<div>
<h2>Fruits</h2>
<input
type="text"
value="${filter}"
oninput="${(e) => setFilter(e.target.value)}"></input>
<ul>
${For(
filteredFruits,
(fruit, index) => html`<li>${fruit.id}. ${fruit.name}</li>`
)}
</ul>
</div>
`;
Behavior
Re-renders the entire list when the array changes
Compares arrays using length and
Object.is()
for each itemAutomatically cleans up previous renders before creating new ones
Provides both item and index to the render function
Performance Notes
The
For
component re-renders the entire list when the array changesFor large lists, consider implementing virtual scrolling or pagination
Use computed values for filtering/sorting to optimize performance
Avoid creating new objects in the render function to prevent unnecessary re-renders
Last updated