Задать вопрос
@kost_p
новичок

Почему неверно устанавливается позиция скролла (React.js)?

Подскажите пожалуйста. Есть два компонента(они же две странице в роуте, главная страница со списком элементов и страница подробного описания). при прокрутке элементы подгружаются по 20шт. Хочу сделать, чтобы при переходе на страницу с подробным описанием элемента списка, сохранять позицию скролла. Чтобы при возвращении назад, мы были рядом с тем элементом по которому кликнули. Сделал стейт:
const [scrollPosition, setScrollPosition] = useState({
    scrollX: 0,
    scrollY: 0,
  });
  console.log("State scrollPosition: ", scrollPosition);

Сделал обработчик клика:
const getCurrentScrollPosition = (e) => {
    //e.preventDefault();
    let cordsAfterClick = {};
    let cords = ["scrollX", "scrollY"];
    cords.forEach((cord) => {
      cordsAfterClick[cord] = window[cord];
    });
    console.log("Obj with cords: ", cordsAfterClick);
    localStorage.setItem("scrollCord", JSON.stringify(cordsAfterClick));
  };

Так же сохраняю данные в локальное хранилище по клику. Далее в useEffect я обновляю стейт и устанавливаю позицию скролла:
useEffect(() => {
    setScrollPosition(JSON.parse(localStorage.getItem("scrollCord")));
    window.scroll(scrollPosition.scrollX, scrollPosition.scrollY);
  }, [scrollPosition.scrollX, scrollPosition.scrollY]);

Но вот проблема в том, что позиция window.scroll() не совпадает. Приведу скрины:
5e933b3a0a347580381907.png
5e933b50a3c70511770470.png
5e933c3382a1b463491259.png5e933c3e74dc3171635775.png
В чем моя ошибка, подскажите пожалуйста.
ps: И может вообще есть решение лучше? а то чувствую, что наворотил делов))
  • Вопрос задан
  • 600 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@McBernar
Думаю, не все элементы успели отрендериться, а скролл уже поехал. Поставьте задержку полсекунды для скроллту и проверьте — если приедет в нужное место, то я прав.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@kost_p Автор вопроса
новичок
UPD: проблему решил. код обновил.
Состояние:
const [scrollPosition, setScrollPosition] = useState({
    scrollX: 0,
    scrollY: 0,
  });

Обработчик клика:
const getCurrentScrollPosition = (e) => {
    let cordsAfterClick = {};
    let cords = ["scrollX", "scrollY"];
    cords.forEach((cord) => {
      cordsAfterClick[cord] = window[cord];
    });
    console.log("Obj with cords: ", cordsAfterClick);
    localStorage.setItem("scrollCord", JSON.stringify(cordsAfterClick));
  };

useEffect:
useEffect(() => {
    setScrollPosition((prevScrollCord) => {
      return {
        ...prevScrollCord,
        ...JSON.parse(window.localStorage.getItem("scrollCord")),
      };
    });
    window.scrollTo(scrollPosition.scrollX, scrollPosition.scrollY);
  }, [scrollPosition.scrollX, scrollPosition.scrollY]);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы