問題描述
我正在尋找使用 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。