javascript - 使用 React JS 无限滚动

标签 javascript html infinite-scroll reactjs

我正在寻找使用 React 实现无限滚动的方法。我遇到过react-infinite-scroll并发现它效率低下,因为它只是将节点添加到 DOM 而不会删除它们。 React 是否有任何经过验证的解决方案,可以在 DOM 中添加、删除和维护恒定数量的节点。

这是 jsfiddle问题。 在这个问题中,我希望 DOM 中一次只有 50 个元素。其他人应该在用户上下滚动时加载和删除。 我们开始使用 React 是因为它的优化算法。现在我找不到解决这个问题的方法。我遇到过airbnb infinite js .但是它是用Jquery实现的。要使用这个 airbnb 无限滚动,我必须放弃我不想做的 React 优化。

我想添加滚动的示例代码是(这里我正在加载所有项目。我的目标是一次只加载 50 个项目)

/** @jsx React.DOM */

var Hello = React.createClass({
    render: function() {
        return (<li>Hello {this.props.name}</li>);
    }
});

var HelloList = React.createClass({ 
     getInitialState: function() {                            
         var numbers =  [];
         for(var i=1;i<10000;i++){
             numbers.push(i);
         }
         return {data:numbers};
     },

    render: function(){
       var response =  this.state.data.map(function(contact){          
          return (<Hello name="World"></Hello>);
        });

        return (<ul>{response}</ul>)
    }
});

React.renderComponent(<HelloList/>, document.getElementById('content'));

寻求帮助...

最佳答案

基本上,当滚动时,您想要决定哪些元素可见,然后重新渲染以仅显示这些元素,顶部和底部的单个间隔元素代表屏幕外元素。

Vjeux在这里做了一个 fiddle ,你可以看看:jsfiddle .

滚动时执行

scrollState: function(scroll) {
    var visibleStart = Math.floor(scroll / this.state.recordHeight);
    var visibleEnd = Math.min(visibleStart + this.state.recordsPerBody, this.state.total - 1);

    var displayStart = Math.max(0, Math.floor(scroll / this.state.recordHeight) - this.state.recordsPerBody * 1.5);
    var displayEnd = Math.min(displayStart + 4 * this.state.recordsPerBody, this.state.total - 1);

    this.setState({
        visibleStart: visibleStart,
        visibleEnd: visibleEnd,
        displayStart: displayStart,
        displayEnd: displayEnd,
        scroll: scroll
    });
},

然后渲染函数将只显示 displayStart..displayEnd 范围内的行。

您可能还对 ReactJS: Modeling Bi-Directional Infinite Scrolling 感兴趣.

关于javascript - 使用 React JS 无限滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21238667/

相关文章:

javascript - 为什么 ngInfiniteScroll(无限滚动)不适用于移动设备?

javascript - Ember.js - jQuery-masonry + 无限滚动

javascript - 上传后 Google 图表不起作用

javascript - Angularjs - UI Router 中的新布局文件

html - 验证(CSS 3.0): "var (--my-border-top)" is not valid value for the "border-top" property

javascript - 确定视频全屏 JavaScript HTML

javascript - 我想在一定时间后自动淡入 div onclick 和淡出 div

javascript - 等待 Promise 返回的第一个 true 的干净方式

python - 如何使用 lxml 以编程方式实例化注释元素?

node.js - 分页/无限滚动时 Firebase endAt() 与 orderByChild() 的时髦行为