У меня проблема с реквизитами для обновления маршрутизатора при каждом изменении маршрута компонентом.
В моем документе есть несколько разделов, и все разделы связаны с меню навигации .., например:
- / о # ABOUTUS
- / о # контакт
В компоненте about я реализовал функцию scrollSpy, например:
scrollSpy() {
if (this.isTransitioning) return;
let hash = this.getCurrentSection();
if (this.state.activeSection != hash) {
this.setState({ activeSection: hash });
history.pushState(null, null, hash);
}
}
, а также функция scrollTo, как это
scrollTo(hash) {
this.isTransitioning = true;
let section = $(hash);
let body = $("html, body");
let navBar = $("#mainNav");
let top = section.offset().top - navBar.height() - 10;
body.stop().animate({
scrollTop: top
}, 800, 'swing', () => {
this.isTransitioning = false;
this.scrollSpy();
})
}
Я также реализую эту функцию для прокрутки статьи в нужный раздел, когда она выбрана на панели навигации.
componentDidUpdate(prevProps, prevState) {
if (this.props.location.hash != prevProps.location.hash) {
this.scrollTo(this.props.location.hash);
}
}
Теперь проблема в том, что когда я вставляю строку для обновления истории в scrollSpy, вот так:
scrollSpy() {
if (this.isTransitioning) return;
let hash = this.getCurrentSection();
if (this.state.activeSection != hash) {
this.setState({ activeSection: hash });
history.pushState(null, null, hash);
this.props.history.push(hash);
}
}
Система будет прокручиваться бесконечно, вверх и вниз.
Кажется, компонент посылает сигнал в React-Router, а реквизиты реакции-маршрутизатора меняются, а scrollSpy снова отправляет обратно в реагирующий маршрутизатор. Так что это вроде застряло в петле. Добавление переменной, такой как isUpdating = true
, не помогло, и сделало ее поведение непредсказуемым. Иногда он прокручивается, иногда просто нет, иногда он прыгает обратно наверх.
Как я могу определить, произошла ли смена реквизита из моего триггера history.push или пользовательской панели навигации? Я хочу, чтобы страница прокручивалась до нужной верхней части раздела, когда пользователь нажимает на панель навигации, даже если это текущий раздел, отображаемый на экране.
Спасибо