У меня проблема при переходе на другую страницу, ее положение останется таким же, как и на предыдущей странице. Таким образом, он не будет автоматически прокручиваться вверх. Я также пробовал использовать window.scrollTo(0, 0)
на onChange
роутере. Я тоже scrollBehavior
исправлял эту проблему, но это не сработало. Есть предложения по этому поводу?
javascript
reactjs
react-router
react-router-redux
Адриан Хартанто
источник
источник
componentDidMount
компонента нового маршрута?document.body.scrollTop = 0;
вcomponentDidMount
компоненты вы движетесь кОтветы:
Документация для React Router v4 содержит примеры кода для восстановления прокрутки. Вот их первый пример кода, который служит решением для всего сайта для «прокрутки вверх» при переходе на страницу:
Затем отобразите его в верхней части приложения, но ниже Router:
^ скопировано прямо из документации
Очевидно, что это работает в большинстве случаев, но есть больше о том, как работать с интерфейсами с вкладками и почему не было реализовано универсальное решение.
источник
Because browsers are starting to handle the “default case” and apps have varying scrolling needs (like this website!), we don’t ship with default scroll management. This guide should help you implement whatever scrolling needs you have.
меня огорчает, потому что все параметры, для которых они приводят примеры кода, на самом деле могут быть встроены в элемент управления через настройки свойств с некоторыми соглашениями о поведении по умолчанию, которые затем можно изменить. Это кажется супер хакерским и незаконченным, имхо. Означает, что только разработчики с продвинутым реагированием могут правильно выполнять маршрутизацию, и никакой #pitOfSuccesswork-arounds
здесь игнорируются. +100 для @danielnixonно классы такие 2018
Реализация ScrollToTop с помощью React Hooks
ScrollToTop.js
Использование:
ScrollToTop также может быть реализован как компонент-оболочка:
ScrollToTop.js
Использование:
источник
scrollToTop
в<Route>
. Кажется, это очень часто используемая функция.action !== 'POP'
. Слушатель принимает действие как 2-й аргументЭтот ответ предназначен для устаревшего кода, для маршрутизатора v4 + проверьте другие ответы
Если это не работает, вы должны найти причину. Также внутри
componentDidMount
вы можете использовать:
вы можете добавить какой-нибудь флаг вроде «scrolled = false», а затем в update:
источник
window.scrollTo(0,0);
onUpdate
hook устарел в react-router v4 - просто хочу указать на этоonUpdate
крючка?Для response-router v4 вот приложение create-react-app, которое обеспечивает восстановление прокрутки: http://router-scroll-top.surge.sh/ .
Для этого вы можете декорировать
Route
компонент и использовать методы жизненного цикла:На странице
componentDidUpdate
мы можем проверить, когда имя пути к местоположению изменилось, сопоставить его сpath
опорой и, если они удовлетворены, восстановить прокрутку окна.Что круто в этом подходе, так это то, что у нас могут быть маршруты, которые восстанавливают прокрутку, и маршруты, которые не восстанавливают прокрутку.
Вот
App.js
пример того, как вы можете использовать вышеуказанное:Из приведенного выше кода интересно отметить, что действие выполняется только при переходе
/about
или/another-page
прокрутке вверх. Однако при продолжении/
прокрутки восстановления не произойдет.Полную кодовую базу можно найти здесь: https://github.com/rizedr/react-router-scroll-top
источник
Home
. Теперь прокрутите внизHome
и перейдите к «Другой странице» и не прокручивайте. Теперь, если вы снова зайдете наHome
, эта страница будет прокручена вверх. Но, согласно вашему ответу,home
страницу нужно держать прокрученной.Примечательно, что
onUpdate={() => window.scrollTo(0, 0)}
метод устарел.Вот простое решение для реактивного маршрутизатора 4+.
источник
#
и?
в конец нашего URL. В первом случае вы должны прокручивать «нет» вверх, во втором случае вы не должны прокручивать вообщеЕсли вы используете React 16.8+, это легко обработать с помощью компонента, который будет прокручивать окно вверх при каждой навигации:
Вот в компоненте scrollToTop.js
Затем визуализируйте его в верхней части приложения, но ниже Router.
Здесь в app.js.
или в index.js
источник
React Hook, который вы можете добавить в свой компонент Route. Использование
useLayoutEffect
вместо пользовательских слушателей.Обновление : обновлено для использования
useLayoutEffect
вместоuseEffect
, для уменьшения визуального мусора. Примерно это означает:useEffect
: визуализировать компоненты -> рисовать на экране -> прокручивать вверх (запускать эффект)useLayoutEffect
: визуализация компонентов -> прокрутка вверх (эффект запуска) -> рисование на экранеВ зависимости от того, загружаете ли вы данные (подумайте о счетчиках) или у вас есть анимация перехода между страницами, это
useEffect
может работать лучше для вас.источник
У меня была такая же проблема с моим приложением. Использование приведенного ниже фрагмента кода помогло мне перейти к началу страницы при нажатии следующей кнопки.
Однако проблема все еще сохранялась в браузере. После множества испытаний я понял, что это произошло из-за объекта истории окна браузера, у которого есть свойство scrollRestoration, для которого установлено значение auto. Установка вручную решила мою проблему.
источник
В компоненте ниже
<Router>
Просто добавьте React Hook (если вы не используете класс React)
источник
Я хочу поделиться своим решением для тех, кто его использует,
react-router-dom v5
поскольку ни одно из этих решений v4 не помогло мне.Что решило мою проблему, так это установка response-router-scroll-top и установка оболочки
<App />
примерно так:и это все! это сработало!
источник
Хуки можно компоновать, и, начиная с React Router v5.1, у нас есть
useHistory()
ловушка. Итак, основываясь на ответе @zurfyx, я создал многоразовый крючок для этой функции:источник
Реагировать на хуки 2020 :)
источник
const ScrollToTop: React.FC = () => {
Я не понимаю, чтоScrollToTop: React.FC
значитМое решение: компонент, который я использую в своих компонентах экранов (где я хочу прокрутить вверх).
Это сохраняет положение прокрутки при возврате. Использование useEffect () было для меня ошибкой, когда при возврате документ прокручивался вверх, а также имел эффект мигания при изменении маршрута в уже прокрученном документе.
источник
Я написал компонент более высокого порядка под названием
withScrollToTop
. Этот HOC принимает два флага:onComponentWillMount
- Следует ли прокручивать вверх при навигации (componentWillMount
)onComponentDidUpdate
- Прокручивать ли вверх при обновлении (componentDidUpdate
). Этот флаг необходим в случаях, когда компонент не размонтирован, но происходит событие навигации, например, от/users/1
до/users/2
.Чтобы использовать это:
источник
Вот еще один способ.
Для response-router v4 вы также можете привязать слушателя к событию изменения истории следующим образом:
Уровень прокрутки будет установлен на 0 без
setImmediate()
слишком, если маршрут будет изменен, щелкнув ссылку, но если пользователь нажмет кнопку возврата в браузере, тогда он не будет работать, поскольку браузер вручную сбрасывает уровень прокрутки до предыдущего уровня при нажатии кнопки возврата , поэтому с помощьюsetImmediate()
мы вызываем выполнение нашей функции после того, как браузер завершит сброс уровня прокрутки, что дает нам желаемый эффект.источник
с React router dom v4 вы можете использовать
создать компонент scrollToTopComponent, как показано ниже
или если вы используете вкладки, используйте что-то вроде приведенного ниже
надеюсь, что это поможет получить больше информации о восстановлении прокрутки, там есть документы, заяц, реагирует на восстановление прокрутки маршрутизатора
источник
Я обнаружил, что
ReactDOM.findDomNode(this).scrollIntoView()
это работает. Я поместил его внутрьcomponentDidMount()
.источник
Для небольших приложений с 1-4 маршрутами вы можете попробовать взломать его с перенаправлением на верхний элемент DOM с #id вместо простого маршрута. Тогда нет необходимости оборачивать маршруты в ScrollToTop или использовать методы жизненного цикла.
источник
В вашем
router.js
просто добавьте эту функцию вrouter
объект. Это сделает работу.Как это,
**Routes.js**
источник
Может быть простым решением, если реквизиты не изменены и componentDidUpdate () не запускается.
источник
Это хакерство (но работает): я просто добавляю
window.scrollTo (0,0);
рендерить ();
источник