Реагировать на бесконечную прокрутку - отображаются двойные полосы прокрутки - мне нужна только полоса прокрутки окна

Я пытаюсь реализовать бесконечную прокрутку для 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 составляет всего 200 пикселей. Конечно, если вы установите его на 100%, бесконечная прокрутка не будет работать, так как она слишком велика. Предлагаю попробовать height: 100vh. Если я взломаю его на вашем коде, это сработает. Но тогда вам также следует увеличить начальное количество элементов - их должно быть как минимум на 1 больше, чем может поместиться на экране. 25 работали у меня.

Rajit 20.05.2018 19:13

Я обновил код. Обычно, когда я визуализирую весь проект, второй компонент - это список, он дает мне двойную прокрутку <div> <First /> <Second /> </div>

born2gamble 20.05.2018 20:38
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
2
3 475
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы не хотите, чтобы отображалась вторая полоса прокрутки, вам необходимо изменить стиль заголовка и дочернего элемента 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 /> не был закреплен наверху? Итак, когда я прокручиваю вниз, я его больше не вижу, и он все еще заполняется, когда я достигаю дна?

born2gamble 20.05.2018 21:41

Да, конечно. Но в этом случае вам нужно переместить ref = "iScroll" в родительский div, а также переместить туда атрибут style. Сообщите мне, если у вас возникнут проблемы, я могу обновить ответ, если вам нужно

Rajit 20.05.2018 21:46

Он заработал с вашей помощью, спасибо за то, что научил меня логике, это очень помогло.

born2gamble 20.05.2018 21:57

Другие вопросы по теме