UNPKG

react-infinite

Version:

A browser-ready efficient scrolling container based on UITableView

88 lines (80 loc) 2.6 kB
var ListItem = React.createClass({ getDefaultProps: function() { return { height: 50, lineHeight: "50px" } }, render: function() { return <div className="infinite-list-item" style={ { height: this.props.height, lineHeight: this.props.lineHeight, overflow: 'scroll' } }> <div style={{height: 50}}> List Item {this.props.index} </div> </div>; } }); var InfiniteList = React.createClass({ getInitialState: function() { return { elements: [], isInfiniteLoading: false } }, componentDidMount: function() { var that = this; setInterval(function() { var elemLength = that.state.elements.length, newElements = that.buildElements(elemLength, elemLength + 1); that.setState({ elements: that.state.elements.concat(newElements) }); }, 500); }, buildElements: function(start, end) { var elements = []; for (var i = start; i < end; i++) { elements.push(<ListItem key={i} index={i}/>) } return elements; }, handleInfiniteLoad: function() { var that = this; this.setState({ isInfiniteLoading: true }); setTimeout(function() { var elemLength = that.state.elements.length, newElements = that.buildElements(elemLength, elemLength + 20); that.setState({ isInfiniteLoading: false, elements: newElements.concat(that.state.elements) }); }, 2000); }, elementInfiniteLoad: function() { return <div className="infinite-list-item"> Loading... </div>; }, render: function() { return <Infinite elementHeight={51} containerHeight={window.innerHeight} infiniteLoadBeginEdgeOffset={300} onInfiniteLoad={this.handleInfiniteLoad} loadingSpinnerDelegate={this.elementInfiniteLoad()} isInfiniteLoading={this.state.isInfiniteLoading} timeScrollStateLastsForAfterUserScrolls={1000} displayBottomUpwards > {this.state.elements} </Infinite>; } }); ReactDOM.render(<InfiniteList/>, document.getElementById('infinite-window-example'));