npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

react-window-dynamic-list

v2.4.2

Published

A naive approach for virtualizing a list with dynamically sized items

Downloads

1,865

Readme

react-window-dynamic-list

Made with the awesome create-react-library

NPM NPM Installs JavaScript Style Guide

How is this different from react-window?

This library comes to partly solve the case of rendering dynamically sized items with react-window, for more information about the issue please read this thread. Before you overjoy please read the limitations of this approach down bellow :sleepy:

Demo

👉 check out dynamic list in action

:pencil2: Play with the demo in sandbox

Install

npm install --save react-window-dynamic-list

Usage

Usage Preview

Yep. its that simple :satisfied:

API

The API is the same as VariableSizeList with some small changes and additions.

Changes

  1. Instead of itemCount you must pass data (read more)
  2. We handle itemSize and estimatedItemSize for you :sunglasses:

Additions

| Property | Type | Required? | Default | Description | | :---------------------- | :------- | :-------: | :-----------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------- | | data | Object[] | ✓ | | All of the data that will be displayed in the list. Each object must contain an unique id field.For example: [{id: 1, ...}, {id: 2, ....}] | | cache | Object | ✓ | | The cache object which the list will use for caching the calculated sizes.Check the example for how to create it. | | lazyMeasurement | boolean | | true | Whether the application should fill the cache in the background.Please note: After each cache clear the application will restart the lazy cache filling (For example after adding or removing an item)For more information read the caching section. | | recalculateItemsOnResize | Object | | { width: false, height: false } | Whether the list should recalculate the items size if its own size has changed. This value should not change from its initial one.Currently the feature is supported but far from perfect, therefore it is disabled by default. | | measurementContainerElement | Function | | ({style, children}) => ReactNode | A custom container element in which the elements will be rendered for measuring. Especially useful for changing the scrollbar width. You must pass the style prop to your element. | | debug | boolean | | false | Whether the measurement layer should be visible, useful for debugging a custom measurementContainerElement |

Implementations details

TL;DR:

Just in time measurement with caching in the background.

Details:

The algorithm is divided into two main concepts:

Just in time measurements:

We measure each item in the list by temporary rendering it with react-dom in a different application. For more information please read this great article.

Caching:

In order for just in time measurements to be effective we need to cache the measurements. Currently there are two caching modes:

  1. Cache only the items that were rendered
  2. On top of caching the rendered items a background task will measure each element and fill the cache. This is the default behavior as it gives a significant performance boost, especially in case of manipulating the data before scrolling through it. In exchange there is a very mild slow down in overall performance in the first couple of seconds and after each change to the size of the list. :warning: Please note: the lazy cache filling will be triggered in case you call resetAfterIndex function of VariableSizeList.

:warning: Requirements and Limitations :warning:

  1. Your data doesn't change its size.

    • Your items size must be determined on mount (No ajax or images).
  2. Currently only supports vertical layout. (didn't have time to implement support for horizontal).

  3. All of the styling regarding the items must be inline or not affected by location in the DOM.

  4. Changes to the list's scrollbar, especially the width, should also effect the measurement container div. Since we pre render the items in order to measure them the size of the scrollbar is important in the pre rendered item as well. This can be achieved in the following ways:

    1. Make sure all of the scrollbars in the application are styled the same
    2. Pass a custom measurement container element via the measurementContainerElement prop.

License

MIT © gnir-work