问题描述

我正在寻找使用 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 在这里做了一个小提琴,你可以看看:

http://jsfiddle.net/vjeux/KbWJ2/9/

滚动后执行

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 感兴趣。

次佳解决方案

查看我们的 React Infinite Libary:

https://github.com/seatgeek/react-infinite

更新 2016 年 12 月

我最近在很多项目中实际上都在使用 react-virtualized,发现它覆盖了大多数用例好多了。两个 Library 都很好,这取决于你正在寻找什么。例如,react-virtualized 支持通过 HOC 称为 CellMeasurer 的可变高度 JIT 测量,例如 https://bvaughn.github.io/react-virtualized/#/components/CellMeasurer

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛