Skip to content

List

A flexible component for rendering lists with optional virtualization support.

Basic Usage

tsx
import { List } from 'flexium/primitives';
import { state } from 'flexium/core';

// Simple list (renders all items)
const [items] = state(['Apple', 'Banana', 'Cherry']);

<List items={items}>
  {(item, index) => <div>{index()}: {item}</div>}
</List>

// Virtual list (for large datasets)
// Virtual list (for large datasets)
const [largeItems] = state(Array.from({ length: 10000 }, (_, i) => `Item ${i}`));

<List items={largeItems} virtual height={400} itemSize={50}>
  {(item, index) => <div>{item}</div>}
</List>

Props

PropTypeDefaultDescription
items() => T[]RequiredData source - reactive getter function
children(item: T, index: () => number) => FNodeRequiredRender function for each item
virtualbooleanfalseEnable virtualization for large lists
heightnumber | string-Container height (required when virtual)
widthnumber | string'100%'Container width
itemSizenumber | SizeConfig-Item height (required when virtual)
overscannumber3Extra items to render (virtual only)
getKey(item: T, index: number) => Key-Key extractor for stable identity
onScroll(scrollTop: number) => void-Scroll callback (virtual only)
onVisibleRangeChange(start, end) => void-Visible range callback (virtual only)
classstring-CSS class name
styleRecord<string, string | number>-Inline styles

SizeConfig

typescript
// Fixed size
interface FixedSizeConfig {
  mode: 'fixed';
  itemHeight: number;
}

// Variable size (experimental)
interface VariableSizeConfig {
  mode: 'variable';
  estimatedItemHeight: number;
  getItemHeight?: (index: number, item: unknown) => number;
}

Examples

Simple List

tsx
const [fruits] = state(['Apple', 'Banana', 'Cherry', 'Date']);

<List items={fruits} getKey={(item) => item}>
  {(fruit, index) => (
    <div style={{ padding: '8px', borderBottom: '1px solid #eee' }}>
      {index()}: {fruit}
    </div>
  )}
</List>

Virtual List with 10K Items

tsx
const [items] = state(
  Array.from({ length: 10000 }, (_, i) => ({
    id: i,
    name: `Item ${i}`,
    email: `user${i}@example.com`
  }))
);

<List
  items={items}
  virtual
  height={600}
  itemSize={80}
  overscan={5}
  getKey={(item) => item.id}
  onVisibleRangeChange={(start, end) => {
    console.log(`Visible: ${start} - ${end}`);
  }}
>
  {(user, index) => (
    <div class="user-card">
      <h3>{user.name}</h3>
      <p>{user.email}</p>
    </div>
  )}
</List>

Released under the MIT License.