A (patched) brutally simple React infinite scroll component
npm install react-simple-infinite-scroll-patched_This repo has been forked purely to publish an npm module to solve https://github.com/jaredpalmer/react-simple-infinite-scroll/issues/6_
---
A brutally simple infinite scroll helper component.
``bash`
npm install react-simple-infinite-scroll --save
This component uses a "sentinel" div (with a React ref) that calls getBoundingClientRect() to measure its position and fire off a callback when it becomes visible again. Note: this package eventually becomes somewhat inefficient on very very very large lists because it keeps adding nodes to the DOM. However, this package is extremely valuable for situations when a windowing technique is not possible and when a user is going to realistically scroll a few hundred rows (and _not_ thousands of rows).
If you can, you probably should. However, windowing only works when you know the total number of items in the result set ahead of time. This isn't always possible. For example, let's say you have a MongoDB database where you cannot efficiently return the total number of documents in a given query. All your API returns is a cursor (so you can know is if there is another page or not). While this would prevent you from using windowing/react-virtualized, react-simple-infinite-scroll will work just fine.
`jsx`
threshold={300}
isLoading={this.state.isLoading}
hasMore={!!this.state.cursor}
onLoadMore={this.loadMore}
>
{this.state.myArrayOfItems.map(item => {/ ... /})}
`jsx`
threshold={300}
isLoading={this.state.isLoading}
hasMore={!!this.state.cursor}
onLoadMore={this.loadMore}
render={({ sentinel }) => (
{this.state.myArrayOfItems.map(item => {/ ... /})}
{sentinel}
)}
/>
`jsxstoreData
// Small react-redux pseudocode
// is information extracted from the store
const MyComponent = ({ sentinel, storeData }) => (
{storeData.entities}
{sentinel}
);
const ConnectedComponent = connect(/ ... /)(MyComponent);
threshold={300}
isLoading={storeData.isLoading}
hasMore={storeData.hasMore}
onLoadMore={() => boundActions.fetchMoreEntities(storeData.cursor)}
component={ConnectedComponent}
/>
`
`jsx
import React from 'react'
import { InfiniteScroll } from 'react-simple-infinite-scroll'
export class MyInfiniteScrollExample extends React.Component {
state = {
items: [],
isLoading: true,
cursor: 0
}
componentDidMount() {
// do some paginated fetch
this.loadMore()
}
loadMore = () => {
this.setState({ isLoading: true, error: undefined })
fetch(https://api.example.com/v1/items?from=${this.state.cursor})
.then(res => res.json())
.then(
res => {
this.setState(state => ({
items: [...state.items, ...res.items],
cursor: res.cursor,
isLoading: false
}))
},
error => {
this.setState({ isLoading: false, error })
}
)
}
render() {
return (
API Reference
$3
####
hasMore: booleanRequired
Specifies if there are more entities to load.
####
isLoading: booleanRequired
When
true, onLoadMore() will not be executed on scroll.####
onLoadMore: () => voidRequired
Called when the user has scrolled all the way to the end. This happens when the
sentinel has reached the threshold.####
threshold?: numberScroll threshold. Number of pixels before the
sentinel reaches the viewport to trigger onLoadMore().####
throttle?: number = 64Defaults to
64. Scroll handler will be executed at most once per the number of milliseconds specified.Warning: Making this number closer to zero can decrease performance due to a force reflow caused by
getBoundingClientRect(), see more properties that can cause this issue in this gist by Paul Irish.####
render?: (props: ScrollProps) => React.ReactNodeCallback used for convenient inline rendering and wrapping. Arguments passed
Object: { sentinel, children }. Use this if you have a more complex layout where the sentinel needs to be injected.Warning: The
sentinel must be rendered (injected into the DOM) in order for this library to work properly, failing to do so will result in errors and unexpected side effects.####
component?: React.ComponentTypeReact component. Similar to the
render() prop, this component will receive Object: { sentinel, children } as props. Note that render() prop has precedence over this property, meaning that if both are present, component will not be rendered.Warning: The
sentinel must be rendered (injected into the DOM) in order for this library to work properly, failing to do so will result in errors and unexpected side effects.Alternatives
brigade/react-waypoint`* Jared Palmer @jaredpalmer
|
jared palmer
💻 📖 💡 |
pablo garcia
💻 📖 💡 |
| :---: | :---: |
This project follows the all-contributors specification.