Бесконечное обновление состояния при реализации бесконечной прокрутки в React JS

Я хочу добавить в свой проект бесконечную прокрутку, но столкнулся с проблемой. Я получаю ошибку в консоли, что мое состояние обновляется очень часто. Я использую плагин: React Infinite Scroller. Если я правильно понимаю, при открытии страницы должна отображаться одна страница и запрашиваться функция gen_div, но возникает ошибка. Спасибо!

MyComponent {
    constructor(props) {
       super(props);
       this.state = {div_list: []}
    }

    gen_div() {
       var new_list = this.state.div_list;
       new_list.push(<div>1</div>);
       new_list.push(<div>2</div>);
       new_list.push(<div>3</div>);
       this.setState({div_list: new_list})
    }

    render() {
       return(
           <InfiniteScroll
             pageStart = {1}
             loadMore = {this.gen_div}
             hasMore = {true}
             loader=(<h4>Loading..</h4>)
            >
              {this.state.div_list}
            </InfiniteScroll>
       )
    }

}

Есть много вещей, которые могут быть проблемой. Например, привязка this в приведенном выше примере выглядит неверной. Не могли бы вы отредактировать, чтобы сообщить точную ошибку?

Jclangst 05.09.2018 00:49

Кстати, вы мутируете состояние. var new_list = this.state.div_list создает ссылку на массив состояний, а затем .push() изменяет массив состояний. Мутантное состояние в React - большой запрет. Сделайте копию массивов состояний / объектов, которые вы хотите изменить: var new_list = this.state.div_list.slice();. Также обратите внимание на оператор распространения, который позволяет быстро и легко копировать массивы / объекты.

Jayce444 05.09.2018 01:12
Поведение ключевого слова "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) для оценки ваших знаний,...
0
2
95
1

Ответы 1

Попробуйте использовать setState с обратным вызовом.

gen_div = () => {
    this.setState(prevState => {
        let new_list = prevState.div_list;
        new_list.push(<div>1</div>);
        new_list.push(<div>2</div>);
        new_list.push(<div>3</div>);
        return({{...prevState}, {div_list: new_list}});
    }
}

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