Загрузить больше при прокрутке вниз в Reactjs

Это страница моей открытки (только конкретная часть), где я отображаю данные из полученного Api.

fetchMoreData(){
    this.setState({
        index: this.state.index + 5 
    })
}
    componentDidMount(){
        window.addEventListener('scroll', this.onScroll);
        this.fetchMoreData();
    }

    onScroll = () => {
        $(window).scroll(function() {   
            if ($(window).scrollTop() + $(window).height() == $(document).height()) {
                this.fetchMoreData();
            }
         });
       }

Поскольку мой API - это API для тестирования, я получаю все данные со своей страницы сообщений, а затем передаю их на страницу моей открытки, поэтому при изменении this.state.index отображается больше элементов.

Проблема, с которой я столкнулся, заключается в том, что я получаю сообщение об ошибке, что this.fetchMoreData () не является функцией. Не стесняйтесь указывать на любые ошибки.

Поведение ключевого слова "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) для оценки ваших знаний,...
2
0
2 913
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Сделайте fetchMoreData функцией стрелки так же, как onScroll

fetchMoreData = () => {
  ...
}
Ответ принят как подходящий
onScroll = () => {
    $(window).scroll(() => {
        if ($(window).scrollTop() + $(window).height() == $(document).height()) {
            this.fetchMoreData();
        }
    });
}

Если вы используете function, он будет вызываться в контексте объекта window (в вашем случае). Вы можете использовать замыкания для сохранения родительского контекста, например:

onScroll = () => {
    const that = this;

    $(window).scroll(function () {
        if ($(window).scrollTop() + $(window).height() == $(document).height()) {
            that.fetchMoreData();
        }
    });
};

Но стрелочные функции связывают аргумент this с аргументом родительской области, поэтому this будет ссылаться на ваш класс компонента. И это намного элегантнее и проще, чем использование function, особенно если вы уже используете стрелочные функции в своем компоненте.

не могли бы вы объяснить.

Irtaza Rawjani 31.07.2018 10:11

добавил некоторое объяснение

Igor Alemasow 31.07.2018 10:28

вы можете использовать стрелочную функцию es6, потому что вам нужно привязать это значение из функции к нашему классу. так что это не сработает $(window).scroll(function() {. так что вы можете сделать это.

$(window).scroll(() => {
        if ($(window).scrollTop() + $(window).height() == $(document).height()) {
            this.fetchMoreData();
        }
    });

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