Автоматическая прокрутка до элемента привязки тега в react с помощью componentDidUpdate

#javascript #reactjs #url #autoscroll

#javascript #reactjs #url #автопрокрутка

Вопрос:

  • Мой URL

https://abc1234.com/users#api-doc

  • HTML
 
    <div className={parent}>
        <div className={child}>
            {someContent}
            <a id="api-doc">Hello API</a>
        </div>
    </div>

  

Я пишу страницу в ReactJS. Мне нужно реализовать способ, чтобы страница автоматически прокручивалась вниз до хэша, т.Е. api-doc, но почему-то это не автоматическая прокрутка при загрузке страницы (в самый первый раз).

Я попробовал обходной путь, который выглядит следующим образом

 
    componentDidUpdate(){
        let id = this.props.history.location.hash.replace("#", "");
        let element = document.getElementById(id);
        setTimeout(() => {
            if (element) {
                element.scrollIntoViewIfNeeded(true);
            }
        }, 200);
    }
  

Это работает, но я ищу лучший способ добиться того же

Другими словами, я не хочу использовать setTimeout .

Я добавил setTimeout, потому что нашел этот документ.getElementById(id) выдает значение null (в самый первый раз), я предполагаю, что каким-то образом componentDidUpdate выполняется до полного рендеринга. Я также использовал dangerouslySetInnerHTML .

Ответ №1:

Вы правы, что document.getElementById(id) возвращает null , потому что элемент еще не отрисован.

С React не использовать document.getElementById() . Узлы React сами по себе не являются реальными узлами DOM (например, текстовыми узлами или узлами элементов), а представляют собой потенциальный узел DOM.

Вместо этого используйте useRef() документацию hook React

Создайте следующий компонент.

 import React, { useRef, useEffect }  from 'react';

const myComponent = (props) => {

  const myRef = useRef();

  function scrollToComponent() {
    if (window.location.hash === '#api-doc') {
      myRef.current.scrollIntoView();
      myRef.current.focus();
    }
  }

  useEffect( () => scrollToComponent(), [] )

  return (
    <div ref={myRef} id="api-doc">
       ...
    </div>
  )
};

export default myComponent;
  

Использование useEffect этого способа будет (только) срабатывать при монтировании компонента. (таким образом, избегая проблемы с запуском JS до монтирования компонента)

Функция, которую я назвал scrollToComponent , проверит URL на наличие хэша, если она пройдет условие, она будет прокручиваться до ссылки.

Не забудьте импортировать компонент в ваш основной файл.

* Примечание: использование ссылки от маршрутизатора React может быть лучшим решением. (но один из них мне не знаком)