Я пытаюсь реализовать бесконечную прокрутку для React.js. Все работает нормально, Кроме Я хочу иметь возможность использовать полосу прокрутки окна, чтобы активировать бесконечную прокрутку. Код на данный момент имеет 2 полосы прокрутки (мне нужна только одна).
Здесь дан ответ на код из stackoverflow, я прочитал его полный ответ, я попытался установить высоту на 100%, но из-за этого бесконечная прокрутка не работает. : Stackoverflow - ответил Аникет Джа (самый длинный ответ с 4 голосами)
Двойная прокрутка происходит, когда я визуализирую это таким образом:
<div>
<First />
<div ref = "iScroll" style = {{ height: "100vh", overflow: "auto"}}>
<ul>
{this.displayItems()}
</ul>
{this.state.loadingState ? <p className = "loading"> loading More
Items..</p> : ""}
</div>
</div>
У меня есть ссылка на Codepen, если это поможет
class Layout extends React.Component {
constructor(props) {
super(props);
this.state = {
items: 30,
loadingState: false
};
}
componentDidMount() {
this.refs.iScroll.addEventListener("scroll", () => {
if (this.refs.iScroll.scrollTop + this.refs.iScroll.clientHeight >= this.refs.iScroll.scrollHeight - 20){
this.loadMoreItems();
}
});
}
displayItems() {
var items = [];
for (var i = 0; i < this.state.items; i++) {
items.push(<li key = {i}>Item {i}</li>);
}
return items;
}
loadMoreItems() {
if (this.state.loadingState){
return;
}
this.setState({ loadingState: true });
setTimeout(() => {
this.setState({ items: this.state.items + 10, loadingState: false });
}, 1000);
}
render() {
return (<div>
<First />
<div ref = "iScroll" style = {{ height: "100vh", overflow: "auto"}}>
<ul>
{this.displayItems()}
</ul>
{this.state.loadingState ? <p className = "loading"> loading More Items..</p> : ""}
</div>
</div>
);
}
}
class First extends React.Component {
constructor(props) {
super(props);
this.state = {
};
}
render() {
return (
<h1>Testing</h1>
)
}
}
ReactDOM.render(<Layout />, document.getElementById('example'));
Я обновил код. Обычно, когда я визуализирую весь проект, второй компонент - это список, он дает мне двойную прокрутку <div> <First /> <Second /> </div>



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы не хотите, чтобы отображалась вторая полоса прокрутки, вам необходимо изменить стиль заголовка и дочернего элемента div так, чтобы они соответствовали доступному окну просмотра.
В вашем коде у вас есть height: '100%' для прокручиваемого div. Это стилизует div так, что ему не нужно прокручивать, и поэтому бесконечная прокрутка не работает.
Если вы стилизуете этот div так, чтобы он занимал меньше высоты доступного окна просмотра, и визуализировали достаточно элементов, чтобы заполнить его, бесконечная прокрутка будет работать нормально.
Если затем стилизовать комбинацию div заголовка так, чтобы она точно соответствовала доступному пространству области просмотра, у вас не будет второй полосы прокрутки.
Ниже представлен вариант, который вам нужно сделать. Что я сделал, так это установил высоту прокручиваемого div равной высоте области просмотра (100vh) за вычетом 100px. Это точно не рассчитано, но вам нужно вычесть пространство, необходимое для заголовка, из размера области просмотра.
Эта реализация подходит мне и вам.
class Layout extends React.Component {
constructor(props) {
super(props);
this.state = {
items: 30,
loadingState: false
};
}
componentDidMount() {
this.refs.iScroll.addEventListener("scroll", () => {
if (this.refs.iScroll.scrollTop + this.refs.iScroll.clientHeight >= this.refs.iScroll.scrollHeight - 20){
this.loadMoreItems();
}
});
}
displayItems() {
var items = [];
for (var i = 0; i < this.state.items; i++) {
items.push(<li key = {i}>Item {i}</li>);
}
return items;
}
loadMoreItems() {
if (this.state.loadingState){
return;
}
this.setState({ loadingState: true });
setTimeout(() => {
this.setState({ items: this.state.items + 10, loadingState: false });
}, 1000);
}
render() {
return (<div>
<First />
<div ref = "iScroll" style = {{ height: "calc(100vh - 100px)", overflow: "auto"}}>
<ul>
{this.displayItems()}
</ul>
{this.state.loadingState ? <p className = "loading"> loading More Items..</p> : ""}
</div>
</div>
);
}
}
class First extends React.Component {
constructor(props) {
super(props);
this.state = {
};
}
render() {
return (
<h1>Testing</h1>
)
}
}
ReactDOM.render(<Layout />, document.getElementById('example'));<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id = "example"></div>Возможно ли, чтобы компонент <First /> не был закреплен наверху? Итак, когда я прокручиваю вниз, я его больше не вижу, и он все еще заполняется, когда я достигаю дна?
Да, конечно. Но в этом случае вам нужно переместить ref = "iScroll" в родительский div, а также переместить туда атрибут style. Сообщите мне, если у вас возникнут проблемы, я могу обновить ответ, если вам нужно
Он заработал с вашей помощью, спасибо за то, что научил меня логике, это очень помогло.
Я не уверен, что вы имеете в виду под «двойными полосами прокрутки», но я вижу, что высота div составляет всего 200 пикселей. Конечно, если вы установите его на 100%, бесконечная прокрутка не будет работать, так как она слишком велика. Предлагаю попробовать
height: 100vh. Если я взломаю его на вашем коде, это сработает. Но тогда вам также следует увеличить начальное количество элементов - их должно быть как минимум на 1 больше, чем может поместиться на экране. 25 работали у меня.