0.0.1-alpha3 • Published 2 years ago

@kenh24/solid-virtual-list v0.0.1-alpha3

Weekly downloads
-
License
MIT
Repository
-
Last release
2 years ago

Solid Virtual List

Props

proptypedescriptiondefaultValue
dataSource*Arrayyour data for rendering
dataId*()=> string | stringunique id for every data item
itemRender*() => JSX.Elementthe function to render item in virtual list
estimateSizenumberthe estimateSize of every item in virtual list50
keepsnumberthe count for rendering in the virtual list30
directionvertical | horizentalthe scroll direction of virtual listvertical

Fixed Size example

  • Pass data, render Function and estimateSize to the component.
import SolidVirtualList from "solid-virtual-list";

const FixedSizeComponent = () => {
  const dataSource = new Array(1000).fill(0).map((_, index) => ({ id: index }));

  return (
    <div style={{ overflow: "auto", height: "600px", width: "100%" }}>
      <SolidVirtualList
        estimateSize={60}
        dataSource={dataSource}
        dataId={"id"}
        itemRender={(index) => <div># {index}</div>}
      />
    </div>
  );
};

export default FixedSizePage;

Dynamic Size example

  • The virtual list use ResizeObserver to detect every item's size.
  • You don't need to pass extra attribute to the component when every item has different size.
import { createSignal } from "solid-js";
import SolidVirtualList from "solid-virtual-list";

interface Data {
  id: string;
  height: string;
}

const generateDataSource = (count: number) => {
  return new Array<Data>(count).fill({} as Data).map((_, index) => ({
    id: `${index}-${Math.random()}`,
    height: `${Math.floor(Math.random() * 60 + 60)}px`,
  }));
};

const DynamicSizePage = () => {
  const [dataSource] = createSignal<Data[]>(generateDataSource(1000000));

  return (
    <div style={{ overflow: "auto", height: "600px", width: "100%" }}>
      <SolidVirtualList<Data>
        estimateSize={80}
        dataSource={dataSource()}
        dataId={"id"}
        itemRender={(index, data) => {
          const height = data.height;

          return (
            <div style={{ height }}>
              <span># {index}</span>
              <span>height = {height}</span>
            </div>
          );
        }}
      />
    </div>
  );
};

export default DynamicSizePage;

Roadmap

  • header and footer slot
  • calculateSize prop
  • demo website
  • page mode
0.0.1-alpha3

2 years ago

0.0.1-alpha2

2 years ago

0.0.1-alpha1

2 years ago