Interested in sponsoring react-virtualized development? Learn more.
Install react-virtualized
using npm.
npm install react-virtualized --save
ES6, CommonJS, and UMD builds are available with each distribution. For example:
// Make sure to import default styles.
// This only needs to be done once; probably during your application's bootstrapping process.
import 'react-virtualized/styles.css';
// Then you can import any react-virtualized components you need.
// Tree-shaking is supported with ES6 or CommonJS usage.
import { Grid } from 'react-virtualized'
Alternately you can load a global-friendly UMD build:
<link rel="stylesheet" href="path-to-react-virtualized/styles.css">
<script src="path-to-react-virtualized/dist/umd/react-virtualized.js"></script>
React Virtualized has very few dependencies and most are managed by NPM automatically.
However the following peer dependencies must be specified by your project in order to avoid version conflicts:
react
,
react-addons-shallow-compare
, and
react-dom
.
NPM will not automatically install these for you but it will show you a warning message with instructions on how to install them.
By default all react-virtualized components use shallowCompare
to avoid re-rendering unless props or state has changed.
This ocassionally confuses users when a collection's data changes (eg ['a','b','c']
=> ['d','e','f']
) but props do not (eg array.length
).
The solution to this is to let react-virtualized know that something external has changed. This can be done a couple of different ways.
The shallowCompare
method will detect changes to any props, even if they aren't declared as propTypes
.
This means you can also pass through additional properties that affect cell rendering to ensure changes are detected.
For example, if you're using VirtualScroll
to render a list of items that may be re-sorted after initial render- react-virtualized would not normally detect the sort operation because none of the properties it deals with change.
However you can pass through the additional sort property to trigger a re-render.
For example:
<VirtualScroll
{...virtualScrollProps}
sortBy={sortBy}
/>
Grid
and Collection
components can be forcefully re-rendered using forceUpdate
.
For FlexTable
and VirtualScroll
, you'll need to call forceUpdateGrid
) to ensure that the inner Grid
is also updated.
API documentation available here.
There are also a couple of how-to guides:
- Customizing classes and styles
- Displaying items in reverse order
- Using AutoSizer
- Creating an infinite-loading list
- Displaying a reverse list
Examples for each component can be seen in the documentation.
Here are some online demos of each component:
- ArrowKeyStepper
- AutoSizer
- CellMeasurer
- Collection
- ColumnSizer
- FlexTable
- Grid
- InfiniteLoader
- ScrollSync
- VirtualScroll
- WindowScroller
And here are some "recipe" type demos:
react-virtualized aims to support all evergreen browsers and recent mobile browsers for iOS and Android. IE 9+ is also supported (although IE 9 will require some user-defined, custom CSS since flexbox layout is not supported).
If you find a browser-specific problem, please report it along with a repro case. The easiest way to do this is probably by forking this Plunker.
Here are some great components built on top of react-virtualized:
- react-infinite-calendar: Infinite scrolling date-picker with localization, themes, keyboard support, and more
- react-sortable-hoc: Higher-order components to turn any list into an animated, touch-friendly, sortable list
- react-virtualized-checkbox: Checkbox group component with virtualization for large number of options
- react-virtualized-select: Drop-down menu for React with windowing to support large numbers of options.
Support us with a monthly donation and help us continue our activities. [Become a backer]
Become a sponsor and get your logo on our README on Github with a link to your site. [Become a sponsor]
Use GitHub issues for requests.
I actively welcome pull requests; learn how to contribute.
Changes are tracked in the changelog.
react-virtualized is available under the MIT License.