UNPKG

react-infinite

Version:

A browser-ready efficient scrolling container based on UITableView

182 lines (167 loc) 5.79 kB
var ListItem = createReactClass({ getDefaultProps: function() { return { height: 50, lineHeight: "50px" } }, render: function() { return <div className="infinite-list-item" style={ { height: this.props.height, lineHeight: this.props.lineHeight } }> List Item {this.props.index} </div>; } }); var InfiniteList = createReactClass({ getInitialState: function() { return { elements: this.buildElements(0, 50), isInfiniteLoading: false } }, 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 + 100); that.setState({ isInfiniteLoading: false, elements: that.state.elements.concat(newElements) }); }, 2500); }, elementInfiniteLoad: function() { return <div className="infinite-list-item"> Loading... </div>; }, render: function() { return <Infinite elementHeight={50} containerHeight={250} infiniteLoadBeginEdgeOffset={200} onInfiniteLoad={this.handleInfiniteLoad} loadingSpinnerDelegate={this.elementInfiniteLoad()} isInfiniteLoading={this.state.isInfiniteLoading} timeScrollStateLastsForAfterUserScrolls={1000} > {this.state.elements} </Infinite>; } }); var AdditionInfiniteList = createReactClass({ componentDidMount: function() { setTimeout(this.handleInfiniteLoad, 3000); }, getInitialState: function() { return { elements: this.buildElements(0, 2), isInfiniteLoading: false } }, 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 + 100); that.setState({ isInfiniteLoading: false, elements: that.state.elements.concat(newElements) }); }, 2500); }, elementInfiniteLoad: function() { return <div className="infinite-list-item"> Loading... </div>; }, render: function() { return <Infinite elementHeight={50} containerHeight={250} loadingSpinnerDelegate={this.elementInfiniteLoad()} isInfiniteLoading={this.state.isInfiniteLoading} timeScrollStateLastsForAfterUserScrolls={1000} > {this.state.elements} </Infinite>; } }); var VariableInfiniteList = createReactClass({ getInitialState: function() { return { elementHeights: this.generateVariableElementHeights(100), isInfiniteLoading: false }; }, generateVariableElementHeights: function(number, minimum, maximum) { minimum = minimum || 40; maximum = maximum || 100; var heights = []; for (var i = 0; i < number; i++) { heights.push(minimum + Math.floor(Math.random() * (maximum - minimum))); } return heights; }, handleInfiniteLoad: function() { var that = this; this.setState({ isInfiniteLoading: true }); setTimeout(function() { var newElements = that.generateVariableElementHeights(100); that.setState({ isInfiniteLoading: false, elementHeights: that.state.elementHeights.concat(newElements) }); }, 2500); }, elementInfiniteLoad: function() { return <div className="infinite-list-item"> Loading... </div>; }, render: function() { var elements = this.state.elementHeights.map(function(el, i) { return <ListItem key={i} index={i} height={el} lineHeight={el.toString() + "px"}/>; }); return <Infinite elementHeight={this.state.elementHeights} containerHeight={250} infiniteLoadBeginEdgeOffset={200} onInfiniteLoad={this.handleInfiniteLoad} loadingSpinnerDelegate={this.elementInfiniteLoad()} isInfiniteLoading={this.state.isInfiniteLoading} timeScrollStateLastsForAfterUserScrolls={1000} > {elements} </Infinite>; } }); ReactDOM.render(<InfiniteList/>, document.getElementById('infinite-example-one')); ReactDOM.render(<VariableInfiniteList/>, document.getElementById('infinite-example-two')); ReactDOM.render(<AdditionInfiniteList/>, document.getElementById('infinite-example-three'));