使用React JS无限滚动

JavaScript

Near小哥神奇

2020-03-12

我正在寻找使用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'));

寻求帮助...

第1342篇《使用React JS无限滚动》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

2个回答
神奇启人 2020.03.13

基本上,在滚动时,您想确定哪些元素是可见的,然后重新渲染以仅显示那些元素,顶部和底部有一个spacer元素来代表屏幕外的元素。

Vjeux在这里做了一个小提琴,您可以看一下: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
    });
},

然后render函数将只显示range中的行displayStart..displayEnd

您可能也对ReactJS:双向双向无限滚动建模感兴趣

Pro番长 2020.03.13

查看我们的React Infinite库:

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

2016年12月更新

实际上,最近我在很多项目中都使用了react-virtualized,发现它可以更好地覆盖大多数用例。两种库都很不错,这完全取决于您要查找的内容。例如,react-virtualized支持通过称为的HOC进行可变高度JIT测量CellMeasurer,示例此处为https://bvaughn.github.io/react-virtualized/#/components/CellMeasurer

2018年11月更新

来自react-virtualized的许多经验教训已移植到同一作者的更小,更快,更有效的react-window库中。

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android