Почему React ref element.current возвращает null в компоненте React, используя хук useRef?

Мне нужно запросить элемент DOM и использовать хук useRef:

const Overlay = ({ children }: Props) => {
  const myRef = useRef<HTMLDivElement>(null);

  useEffect(() => {
    console.log(myRef.current);
  }, [myRef]);


  return (
    <React.Fragment>
      <Dialog fullScreen open={open}>
        <DialogContent id="dialog" ref={myRef}>
          <header>
           // Header
          </header>
          {children}
        </DialogContent>
      </Dialog>
    </React.Fragment>
  );
};

export default Overlay;

Если я проверю консоль, она вернет null.

Что мне нужно сделать, чтобы запросить элемент DOM с помощью useRef?


person meez    schedule 03.04.2021    source источник
comment
Пересылка ссылок   -  person Yousaf    schedule 03.04.2021
comment
@Юсаф, спасибо. Но как мне использовать React.forwardRef в моем случае (с диалоговым окном Material UI или DialogContent?   -  person meez    schedule 03.04.2021
comment
Я бы ожидал, что MaterialUI перенаправит ссылку на базовый собственный элемент DOM. Проверьте их документы, чтобы узнать, разрешают ли они пользователям доступ к базовому элементу DOM.   -  person Yousaf    schedule 03.04.2021
comment
@Yousaf, ты имеешь в виду без forwardRef? Просто использовать реквизит ref, как в моем примере? Согласно документации, ref перенаправляется в корневой элемент. Но тогда возникает вопрос, почему сейчас возвращается null?   -  person meez    schedule 03.04.2021
comment
вы имеете в виду без forwardRef? Просто использовать реквизит ref, как в моем примере? - да. Если компонент перенаправляет ссылку на собственный элемент DOM, ваш код должен работать. Можете ли вы создать минимальную воспроизводимую демонстрацию и поделиться ссылкой?   -  person Yousaf    schedule 03.04.2021
comment
@Yousaf спасибо, вот ссылка на песочницу. Если вы проверите консоль, вы увидите, что ссылка возвращает null   -  person meez    schedule 03.04.2021
comment
Я видел созданную вами демонстрацию - я получаю ноль только после загрузки первой страницы; после этого собственный элемент DOM регистрируется на консоли. Могу я спросить, зачем вам ref? Что ты пытаешься сделать?   -  person Yousaf    schedule 03.04.2021
comment
Я думаю, что useRef не будет работать с Material UI в моем случае. Что вы думаете? - я никогда не работал с MaterialUI, поэтому я не уверен, почему ваш исходный пример кода не работает должным образом.   -  person Yousaf    schedule 04.04.2021
comment
@Yousaf только что узнал. Мне пришлось добавить реквизит disablePortal в интерфейс материала <Dialog>. Теперь это работает!   -  person meez    schedule 04.04.2021


Ответы (1)


Таким образом, компонент MUI Dialog монтирует свои дочерние элементы только в том случае, если open === true. Я бы предложил сделать ваш useEffect зависимым от состояния open вместо ссылки.

  useEffect(() => {
    if (open) {
      console.log(myRef.current);
    } else {
      // myRef.current is null
    }
  }, [open]);
person dmitryguzeev    schedule 03.04.2021