react-infinite
Version:
A browser-ready efficient scrolling container based on UITableView
77 lines (70 loc) • 2.3 kB
JSX
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,
overflow: 'scroll'
}
}>
<div style={{height: 50}}>
List Item {this.props.index}
</div>
</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={51}
containerHeight={window.innerHeight}
infiniteLoadBeginEdgeOffset={200}
onInfiniteLoad={this.handleInfiniteLoad}
loadingSpinnerDelegate={this.elementInfiniteLoad()}
isInfiniteLoading={this.state.isInfiniteLoading}
timeScrollStateLastsForAfterUserScrolls={1000}
useWindowAsScrollContainer={true}
>
{this.state.elements}
</Infinite>;
}
});
ReactDOM.render(<InfiniteList/>,
document.getElementById('infinite-window-example'));